GoLang变量名由字母、数字、下划线组成,其中首个字符不能为数字,其命名规则参考标识符。声明变量的一般形式是使用
var
关键字。
变量声明方式为:
var [变量名] [变量类型]
// 例
var num int32
可以一次声明多个变量:
var num1, num2, num3 int
变量声明
GoLang中有多声明变量的方式。
第一种,只指定变量类型。如果没有初始化,则变量默认为零值(缺省值、默认值)。
var num int32
fmt.Println(num) // 取零值,输出 0
零值
GoLang 中变量的
默认值
、缺省值
叫做零值
- 数值型(包括complex64/128)零值为
0
。- 布尔型零值为
false
。- 字符串零值为
""
(空字符串)
第二种,根据初始值自行判定变量类型。
var num = 10
fmt.Println(num) // 取初始值,输出 10
fmt.Println(reflect.TypeOf(num)) // 输出 10
var str = "a"
fmt.Println(str) // 取初始值,输出 a
fmt.Println(reflect.TypeOf(str)) // 输出 string
// 使用reflect.TypeOf() 方法需要引入 reflect 包
第三种,省略 var,用 :=
赋值运算符来声明。
num := 10 // 等价于 var num int = 10
fmt.Println(num) // 取初始值,输出 10
并行赋值
可以用用
:=
赋值运算符一次声明多个变量num1, num2 := 10, 20
右边的这些值以相同的顺序赋值给左边的变量,所以 num1 的值是 10, num2 的值是 20。这被称为
并行赋值
或同时赋值
`。
注意 :=
是个声明语句, :=
左侧如果没有声明新的变量,就产生编译错误。
如:
var num int
num := 10
这时候会产生编译错误,因为 num 不是新的变量,它已经声明过了,它相当于同一个变量声明了两次。因为这等价于:
var num int
var num int
num = 10
如果:
var num1 int
num1, num2 := 1, 2
此时不会产生编译错误,因为 num2 之前并没有声明。此外,如果想要交换两个变量的值:
var a int = 1
var b int = 2
a, b = b, a // a 的值为 2,b的值为 1
这样可以省去为了交换变量值而声明的第三个变量。注意,待交换值的变量的类型必须相同,否则编译报错。
可以使用因式分解关键字的写法声明变量,这种方式一般用于声明全局变量。
var (
num1 int
num2 int
)
空白标识符
_, b = 5, 7 // 5 被抛弃
_ 实际上是一个只写变量,你不能得到它的值。这样做是因为 GoLang中你必须使用所有被声明的变量(等会会讲),但有时你并不需要使用从一个函数得到的所有返回值(函数篇会讲)。
并行赋值也被用于当一个函数返回多个返回值时获取返回结果(函数篇会讲)*
未使用的变量
GoLang 中所有已声明的变量必须使用,否则编译报错。
package main
import (
"fmt"
)
func main() {
var num = 10
var str = "a"
fmt.Println(str)
}
这个程序会报错:num declared and not used
,意为变量 num
未使用。
此外, GoLang 中所有已引入的包必须使用,否则编译报错。
package main
import (
"fmt"
"reflect"
)
func main() {
var str = "a"
fmt.Println(str) // 取初始值,输出 a
}
这个程序会报错:imported and not used: "reflect"
,意为包 reflect
未使用。
默认类型
使用 [变量名] := [变量值]
或 var [变量名] = [变量值]
方式声明变量的时候,Go 编译器会给予变量一个默认类型,下面几个变量的默认类型为基本数据类型:
package main
import (
"fmt"
"reflect"
)
func main() {
var int_num = 10
fmt.Println(reflect.TypeOf(int_num)) // 输出 int
var float_num = 0.5
fmt.Println(reflect.TypeOf(float_num)) // 输出 float64
var string_str = "a"
fmt.Println(reflect.TypeOf(string_str)) // 输出 string
var byte_str = 'a'
fmt.Println(reflect.TypeOf(byte_str)) // 输出 int32
}
除非必要(开发文档规范),或是为了节省存储空间,否则建议在用 var [变量名] [变量类型] = [变量值]
方式声明变量时,按照默认类型来声明,可省去诸如类型转换等不必要的麻烦。
以上内容均源于网络,并加上自己的实践和理解,如有错误的地方,请在评论区指正。
有疑问加站长微信联系(非本文作者)