DeepSeek-v3.1
本章聚焦Go语言变量与数据类型基础,阐述了变量声明(标准与批量)及类型零值初始化机制,为编程入门奠基,强调其易学性,为后续深入学习提供清晰指引。
此摘要由CodeSphereAPI分析文章内容生成,仅供参考。

前言

学习任何一门编程语言,都要从语言的基础语法学起。变量与数据类型是编程中最常见且最基础的概念。本章将介绍Go语言中基本的变量和数据类型。

如果读者有其他编程语言基础,特别是C语言,那么对本章内容的学习将会非常轻松。如果读者没有编程语言基础也没有关系,因为本章的内容易于理解。


Go语言变量

变量是用来存储用户数据的。在编程过程中,会有许多不同的对象类型,那么对于不同的对象类型,我们就需要不同的变量类型来存储不同类型的用户数据。

编程语言中常见的数据类型有整型、浮点型、布尔型和结构体等。Go语言的每个变量都有自己的类型,在使用它们之前,必须先经过声明。

声明变量

  • 标准格式:

    • 变量的声明以关键字var开头,后接变量类型,行尾没有其他标点符号。

    • Go语言变量的标准声明格式如下:

var 变量名 变量类型 
  • 例如,声明变量num的类型为int

var num int
  • 批量格式

    • 在实际编程过程中,我们往往需要同时声明多个变量,这种情况下我们可以使用批量格式。

    • 使用关键字var和小括号,可以同时声明多个变量。

    • Go语言变量的批量声明格式如下:

var(
 a int
 b string
 c bool
)

初始化变量

Go语言在声明变量时,会自动对每个变量对应的内存区域进行初始化,即每个变量会有其类型对应的默认值:

  • 整型和浮点型变量的默认值为0。

  • 字符串变量的默认值为空字符串。

  • 布尔型变量默认为false。

  • 切片、映射、函数和指针变量默认为nil。

    • 注意:nil相当于其他编程语言中的null、None和NULL等,指代零值,在Go语言中只能赋值给切片、映射、函数、接口、指针或通道类型。

1. 标准格式

  • Go 语言的标准初始化格式如下:

var 变量名  变量类型 = 表达式

例如:

var num int = 1

2. 编辑器推导类型格式

  • 在标准格式基础上,把变量类型省略后,编辑器会根据等号右边的表达式推导变量的类型。

例如: 使用编辑器推导类型格式初始化变量 age 值为 20:

var age = 20

3. 短变量声明并初始化

  • 变量声明并初始化有一种更为简洁的写法。

    • 使用短变量声明并初始化时,编译器同样会根据等号右边的表达式推导变量的类型。

    • 相对于前两种变量的初始化方法,短变量声明并初始化方法在开发中使用最为普遍。

    • 短变量声明法无法作为全局变量使用!

例如: 

age := 20
  • 使用这种方法,我们可以同时给多个变量赋值,例如:

编写代码🖋

package main

import "fmt"

func main() {
	name, age := "Tim", 18
	fmt.Println("name", name)
	fmt.Println("age", age)
}

运行结果

name Tim
age 18
  • 但是,使用短变量声明并初始化时,需注意变量重复声明的情况:

编写代码🖋

package main

import "fmt"

func main() {
	var name string
	name := "Tim"
	fmt.Println("name:", name)
}

运行结果

# command-line-arguments
./test.go:13:7: no new variables on left side of :=
  • 很显然,编译器报错:在:=的左边没有新变量出现,因为name变量已经在代码的上面已经被声明了,我们重新编写代码。

编写代码🖋

package main

import "fmt"

func main() {
	var name string
	name, age := "Tim", 18
	fmt.Println("name:", name)
	fmt.Println("age", age)
}

运行结果

name: Tim
age 18

PS:在多个短变量声明并初始化中,应至少有一个新声明的变量出现在左值中,这样即使其他变量名存在重复声明的情况,编译器也不会报错。

4. 变量值交换

  • 实际编程中,我们经常会用到变量值的交换,比如需要交换变量a和变量b的值,可通过中间变量c进行交换,代码如下:

编写代码🖋

package main

import "fmt"

func main() {
	var c int
	a := 1
	b := 2
	c = a
	a = b
	b = c
	fmt.Println(a)
	fmt.Println(b)
}

运行结果

2
1
  • 在Go语言中,变量值的交换可以不再使用这种复杂的写法,而是通过多重赋值的特性,完成变量值的交换工作。

编写代码🖋

package main

import "fmt"

func main() {
	a := 1
	b := 2
	a, b = b, a
	fmt.Println(a)
	fmt.Println(b)
}

运行结果

2
1

PS: 多重赋值时,变量的左值和右值按照从左到右的顺序依次赋值。

5. 匿名变量

  • 在赋值给多个变量时,如果存在不需要接收值的变量,可以使用匿名变量来代替。

  • 匿名变量不占用命名空间,不会分配内存,所以匿名变量之间不存在重复声明。

编写代码🖋

package main

import "fmt"

func RetData() (int, int) {
	return 10, 20
}


func main() {
	a, _ := RetData()
	_, b := RetData()
	fmt.Println(a, b)
}

运行结果

10 20
  • RetData()是我们自定义的一个函数,对于它的每次调用,会返回10和20两个整型数值。

  • 调用RetData()函数,使用变量a接收第一个返回值,第二个返回值由匿名变量接收。

  • 调用RetData()函数,使用变量b接收第二个返回值,第一个返回值由匿名变量接收。

  • 由于匿名变量不占用命名空间,也不会分配系统内存,匿名变量与匿名变量之间不会因为多次声明而无法使用。

小结

  • 变量是用来存储用户数据的,Go语言的每个变量都有自己的类型,在使用它们之前,必须先经过声明。

  • 短变量声明并初始化方法在开发中使用最为普遍。

  • 在赋值给多个变量时,如果存在不需要接收值的变量,可以使用匿名变量来代替。