Golang变量的声明

var 变量(variable)的功能是存储用户的数据,不同的逻辑有不同的对象类型,也就有不同的变量类型。常见的变量类型有:整型、浮点型、字符型、布尔型、结构体等。

Golang的每一个变量都有自己的类型,必须经过声明之后才能使用。

1
2
3
4
5
6
7
var a int          // 声明一个整型类型的变量,可以保存整数类型数据
var b string // 声明一个字符串类型变量
var c []float32 // 声明一个32位浮点切片类型的变量,浮点切片表示有多个浮点型组成的数据结构
var d func() bool // 声明一个返回值为布尔类型的函数变量这种类型一般用于回调函数,即函数以变量的形式保存下来,在需要的时候重新调用这个函数
var e struct{ // 声明一个结构体类型的变量,这个结构体拥有一个整型的x字段
x int
}

Golang以var关键字开头,要声明的变量名放在中间,将其类型放在类型后面,行尾不要要分号

标准格式

Golang的变量声明的标准格式为:

1
var 变量名 变量类型

批量格式

使用var关键字和括号,可以将一组变量定义放在一起

1
2
3
4
5
6
7
8
9
var (
a int
b string
c []float32
d func() bool
e struct{
x int
}
)

Golang变量的初始化

Golang在声明变量的时候,自动对变量对应的内存区域进行初始化操作,每个变量初始化其类型的默认值。当然,可以在声明变量的时候赋予变量一个初始值。在C语言中,变量声明时,并不会对变量的对应的内存区域进行清理操作,此时,变量的值可能是完全不可预知的结果,所以在使用C语言进行变量的声明的时候一定要进行初始化操作,稍有不慎就会出现不可预知的错误,微软的VC编译器会将没有初始化的栈空间以16进制的0xCC填充,而没有初始化的堆空间使用0xCD填充,这两个码在中文的GB2312编码中正好对应着“烫”和“屯”,因此,如果一个字符串么有结束符\0,直接输出的内存数据转换成字符串就刚好对应“烫烫烫”和“屯屯屯”。

例如:

  • 整型和浮点型变量的默认值为0
  • 字符串变量的默认值为空字符串
  • 布尔型变量默认为bool
  • 切片、函数、指针变量的默认值为null

变量初始化的标准格式

1
2
var 变量名 类型 = 表达式
var a int = 100

编译器推导类型的格式

上面的代码中,100和int同为int类型,int可以认为是冗余信息,因此可以进一步进行简化初始化的写法,在标准格式的基础上,将int省略后,编译器会尝试根据等号右边的表达式推导a变量的类型。

1
var a = 100

等号右边的部分在编译原理里被称为右值(rvalue)

短变量声明并初始化

var的变量声明还有一种更为精简的写法,比如:

1
a := 100

这是Golang的推导声明写法,编译器会自动根据右值;类型推导出左值对应的类型

注意:由于使用了:=,而不是赋值的=,因此推导声明写法的左值变量必须是没有定义过的变量,如果左值变量之前被定义过,则会导致编译器编译错误。

注意:在多个短变量声明和赋值中,至少有一个新的申明的变量出现在左值中,即便其它变量名可能是重复声明的,编译器也不会报错。
比如:

1
2
conn, err := net.Dial("tcp", "127.0.0.1")
conn2, err := net.Dial("tcp", "127.0.0.1")

匿名变量

很多时候一个函数可能返回多个返回值,但是如果我们只需要其中的一个值,那么我们不得不再定义一堆没有的变量去对应函数的返回值,在Golang中使用匿名变量的形式来解决这个问题。

1
-,-,nikcName := GetName()

常量定义

Golang通过const来进行常量的定义,如下代码所示:

1
2
3
4
5
6
7
8
9
const PI float64 = 3.14159265358979323 // float64类型浮点常量
const zero = 0.0 // 无类型的浮点常量
const (
size float32 = 3.333333
eof = -1 //无类型的整型
)
//多重复值
const u, v float64 = 0, 3
const a, b, c = 3, 4, "foo"

Golang的常量可以限定类型,但是这个不是必须的,当没有限定常量的类型的时候,那么编译器将会当做无类型的常量处理