hello云胜

技术与生活

0%

变量声明

变量声明的意义:go是静态语言。变量声明是告诉编译器该变量可以操作的内存边界信息,这主要是看变量的类型。

go的变量声明语句:

1
var a int = 10

对比java

1
int a = 10;

go将变量名放在了变量类型的前面,为啥要这样设计?难道只是为了特立独行?

Go’s Declaration Syntax - go.dev

原生类型

零值

如果变量声明时没有显式为变量赋予初始值,Go 编译器会为变量赋予这个类型的零值

go的所有原生类型都有默认值

内置原生类型 默认值/零值
所有整型类型 0
浮点类型 0.0
布尔类型 FALSE
字符串类型 “”
指针、接口、函数、切片、channel、map nil

另外,像数组、结构体这样的复合类型变量的零值就是其组成元素的零值的复合

块声明和单行声明

go可以使用block块进行集中声明

1
2
3
4
5
var {
a int = 100
b int8 = 88
c string = "hello"
}

也可以在一行中进行多个声明

1
var a, b, c int = 4, 5, 6

两者可以组合起来使用

1
2
3
4
var {
a, b, c int = 4, 5, 6
s, t string = "hello", "world"
}

类型推断

go提供了自动类型推断的语法糖,使我们进行变量声明时可以省略类型

1
var a = 10

自动推断的逻辑:根据右侧变量的值推断类型。整型值的默认类型就是int,浮点型的时float64,布尔值的是bool,字符值的是rune,字符串的是string

因为自动推断类型是根据值反推,所有声明语句必须赋值。var a这种声明是不合法的

因为有了类型推断,所以上面的单行语句

1
var a, s, b = 10, "haha", true

短变量声明

类型推断进一步简化,将var关键字省去

1
a := 10

短变量声明也支持单行格式

1
a, s, b := 10, "haha", true

那么问题来了,为什么有两种变量申明方式?

绝不只是为了少敲两次键盘。一个很重要的原因是短变量声明可以很方便的进行重构。

变量作用域

go的变量从作用域上分为两种:包级变量和局部变量。比java简单多了。

如果这个包级变量的首字母大写,那么这个包级变量可以视为一个全局变量。

包级变量

在方法外声明的变量就是包级变量

包级变量只能用var声明,不能用短变量声明

包级变量可以只声明,不进行初始化,go语言也会让这些变量拥有零值。

1
var a int32
代码规范建议
  • 相同类型的变量声明放在同一个var代码块下
  • 显示初始化和非显式初始化的变量声明分开
  • 就近原则。进行在第一次使用这个变量的前面声明变量.当然了,如果一个包级变量在包内部被多处使 用,那么这个变量还是放在源文件头部声明比较适合的。

局部变量

局部变量仅声明而不初始化,只能用var形式。

声明同时进行初始化,建议采用短变量形式