(作者:全栈工程师开发手册)
1. 变量声明方式
以下代码中展示了Go中的5种变量声明的方式,均在main函数中。
第一种,先声明变量类型,再给变量赋值。
第二种,在声明变量类型的同时,给变量赋值。
第三种,同时给两个类型相同的变量进行快速的声明和赋值。
第四种,同时给两个类型不同的变量进行快速的声明和赋值。
第五种,通过更简单的方式来声明变量,同时赋值,去掉了var关键字和类型的定义,编译器会自动判断变量的类型。这种声明方式只能在函数中使用。
package main
import (
"fmt"
)
func main() {
var a int
a = 1
var s string = "true"
var b,c bool = true,false
var (
d float64 = 6.6
arr = [4]int{0,1,2,3}
)
f := "shorter claim"
fmt.Println(a,b,c,d,arr,s,f)
}
运行代码的结果如下:
2. 变量声明和赋值的禁忌
1) Go中的变量赋值对类型把控非常严格,整数只能赋值给整型变量,字符串只能赋值给字符串型变量。
2) Go中的变量不可重复声明,但可重复赋值,重复声明将会报错。如下:
package main
import (
"fmt"
)
func main() {
var s string = "true"
var s string = "1"
fmt.Println(s)
}
3. 不同类型变量的默认值
我们通过代码来看每种类型变量的默认值
package main
import (
"fmt"
)
func main() {
var a int
var b float64
var c string
var d bool
var f [4]string
fmt.Println(a,b,c,d,f)
}
可以看到,整数和浮点数默认值为0,字符串的默认值为"",布尔型变量的默认值为false,数组的默认值根据数组元素的默认值来的。
4. 变量的作用域
1) Go语言中的,由块来定义变量的作用域,而块由花括号{}来定义;
2) 块可以进行嵌套,外部块不可引用内部块中定义的变量,但内部块可以引用外部块中定义的变量;
3) 无包含关系的块间定义的变量不能相互引用。
我们可以通过一个例子来看:
package main
import (
"fmt"
)
var s string ="shorter claim"
func test() {
b := true
fmt.Println(s,b)
fmt.Println(a)
}
func main() {
test()
a := 1
fmt.Println(a,b,s)
}
其执行结果为:
在test中定义的变量b,在main中无法识别,在main中定义的变量a,在test中无法识别,我们做些改动,只在函数内部输出块内定义的变量和文件中在所有函数外定义的变量。
package main
import (
"fmt"
)
var s string ="shorter claim"
func test() {
b := true
fmt.Println(s,b)
// fmt.Println(a)
}
func main() {
test()
a := 1
// fmt.Println(a,b,s)
fmt.Println(a,s)
}
运行结果如下:
如此,可加深对变量作用域的理解。
5. 指针
Go语言在声明变量时,会在计算机内存中分配一个存储位置给变量,通过&符号可以获取到变量存储的位置,如变量a的位置用&a可获取,如果得到的参数是指针,想要获取其值,则用星号*可得到。下面用一段代码来理解:
package main
import (
"fmt"
)
func test(a *int) {
b := 2
fmt.Println(a,*a)
c := *a+b
fmt.Println(c)
}
func main() {
a := 1
test(&a)
}
运行结果如下:
我们在main函数定义了一个变量a,然后将其指针&a传递给函数test,test中计算时,通过*a将入参指针指向的内存处的整数值取出,与整数b进行相加,得到整数c。
6. 常量的声明
常量可以声明,可以引用,但值不可修改。其声明与变量类似,只是关键字不同,如下:
var s string = "variable"
const sn string = "constant"