Go语言详解 第2.1节 变量

Golang是静态类型语言,不能在运行期间改变变量类型。

定义变量

var 语句定义了一个变量的列表;跟函数的参数列表一样,类型在后面。

初始化变量

使用关键字 var 定义变量,自动初始化为零值。如果提供初始化值,可省略变量类型,由编译器自动推断。

  1. package main
  2. var x int
  3. var f float32 = 1.6
  4. var s = "abc"
  5. func main() {
  6. }

一次性定义多个变量

  1. package main
  2. var x, y, z int
  3. var s, n = "abc", 123
  4. var (
  5. a int
  6. b float32
  7. )
  8. func main() {
  9. n, s := 0x1234, "Hello, World!"
  10. println(x, s, n)
  11. }

输出结果:

0 Hello, World! 4660

多变量赋值时,先计算所有相关值,然后再从左到右依次赋值。

  1. package main
  2. import "fmt"
  3. func main() {
  4. data, i := [3]int{0, 1, 2}, 0
  5. i, data[i] = 2, 100 // (i = 0) -> (i = 2), (data[0] = 100)
  6. fmt.Println(i, data)
  7. }

输出结果:

2 [100 1 2]

变量定义可以包含初始值,每个变量对应一个。

  1. package main
  2. var i, j int = 1, 2
  3. func main() {
  4. }

如果初始化是使用表达式,则可以省略类型;变量从初始值中获得类型。

  1. package main
  2. var c, python, java = true, false, "no!"
  3. func main() {
  4. }

短声明变量

在函数内部,可以使用更简略的 “:=” 方式定义变量。”:=” 简洁赋值语句在明确类型的地方,可以用于替代 var 定义。

  1. package main
  2. import (
  3. "fmt"
  4. )
  5. var c, python, java = true, false, "no!"
  6. func main() {
  7. k := 3
  8. c, python, java := false, true, "yes!"
  9. fmt.Println(c, python, java, k)
  10. //注意检查,是定义新的局部变量,还是修改全局变量。该方式容易造成错误!
  11. }

输出结果:

false true yes! 3

函数外的每个语句都必须以关键字开始( var 、 func 、等等), “:=” 结构不能使用在函数外。

特殊只写变量 “_”,用于忽略值占位。

  1. package main
  2. func test() (int, string) {
  3. return 1, "abc"
  4. }
  5. func main() {
  6. _, s := test()
  7. println(s)
  8. }

输出结果:

abc

编译器会将未使 的局部变量当做错误。

  1. package main
  2. var s string // 全局变量没问题。
  3. func main() {
  4. i := 0 // ./main.go:6:7: i declared and not used (可使 "_ = i" 规避)
  5. }

注意重新赋值与定义新同名变量的区别。

  1. package main
  2. func main() {
  3. s := "abc"
  4. println(&s)
  5. s, y := "hello", 20 // 重新赋值: 与前 s 在同 层次的代码块中,且有新的变量被定义。
  6. println(&s, y) // 通常函数多返回值 err 会被重复使用。
  7. {
  8. s, z := 1000, 30 // 定义新同名变量: 不在同 层次代码块。
  9. println(&s, z)
  10. }
  11. }

输出结果:

0xc42003df60

0xc42003df60 20

0xc42003df58 30

Go 语言变量作用域

作用域为已声明标识符所表示的常量、类型、变量、函数或包在源代码中的作用范围。

Go 语言中变量可以在三个地方声明:

  1. 函数内定义的变量称为局部变量
  2. 函数外定义的变量称为全局变量
  3. 函数定义中的变量称为形式参数

接下来让我们具体了解局部变量、全局变量和形式参数。

局部变量

在函数体内声明的变量称之为局部变量,它们的作用域只在函数体内,参数和返回值变量也是局部变量。

以下实例中 main() 函数使用了局部变量 a, b, c:

  1. package main
  2. import "fmt"
  3. func main() {
  4. /* 声明局部变量 */
  5. var a, b, c int
  6. /* 初始化参数 */
  7. a = 10
  8. b = 20
  9. c = a + b
  10. fmt.Printf("结果: a = %d, b = %d and c = %d\n", a, b, c)
  11. }

输出结果:

结果: a = 10, b = 20 and c = 30

全局变量

在函数体外声明的变量称之为全局变量,全局变量可以在整个包甚至外部包(被导出后)使用。

全局变量可以在任何函数中使用,以下实例演示了如何使用全局变量:

  1. package main
  2. import "fmt"
  3. /* 声明全局变量 */
  4. var g int
  5. func main() {
  6. /* 声明局部变量 */
  7. var a, b int
  8. /* 初始化参数 */
  9. a = 10
  10. b = 20
  11. g = a + b
  12. fmt.Printf("结果: a = %d, b = %d and g = %d\n", a, b, g)
  13. }

输出结果:

结果: a = 10, b = 20 and g = 30

Go 语言程序中全局变量与局部变量名称可以相同,但是函数内的局部变量会被优先考虑。实例如下:

  1. package main
  2. import "fmt"
  3. /* 声明全局变量 */
  4. var g int = 20
  5. func main() {
  6. /* 声明局部变量 */
  7. var g int = 10
  8. fmt.Printf("结果: g = %d\n", g)
  9. }

输出结果:

结果: g = 10

形式参数

形式参数会作为函数的局部变量来使用。实例如下:

  1. package main
  2. import "fmt"
  3. /* 声明全局变量 */
  4. var a int = 20
  5. func main() {
  6. /* main 函数中声明局部变量 */
  7. var a int = 10
  8. var b int = 20
  9. var c int = 0
  10. fmt.Printf("main()函数中 a = %d\n", a)
  11. c = sum(a, b)
  12. fmt.Printf("main()函数中 c = %d\n", c)
  13. }
  14. /* 函数定义-两数相加 */
  15. func sum(a, b int) int {
  16. fmt.Printf("sum() 函数中 a = %d\n", a)
  17. fmt.Printf("sum() 函数中 b = %d\n", b)
  18. return a + b
  19. }

输出结果:

main()函数中 a = 10

sum() 函数中 a = 10

sum() 函数中 b = 20

main()函数中 c = 30

不同类型的局部和全局变量默认值:

全局:

  1. package main
  2. import "fmt"
  3. var b bool
  4. var i int
  5. var i8 int8
  6. var i16 int16
  7. var i32 int32
  8. var i64 int64
  9. var ui uint
  10. var ui8 uint8
  11. var ui16 uint16
  12. var ui32 uint32
  13. var ui64 uint64
  14. var f32 float32
  15. var f64 float64
  16. var s string
  17. func main() {
  18. fmt.Printf("全局变量: bool 默认值:%v\n", b)
  19. fmt.Printf("全局变量: int 默认值:%v\n", i)
  20. fmt.Printf("全局变量: int8 默认值:%v\n", i8)
  21. fmt.Printf("全局变量: int16 默认值:%v\n", i16)
  22. fmt.Printf("全局变量: int32 默认值:%v\n", i32)
  23. fmt.Printf("全局变量: int64 默认值:%v\n", i64)
  24. fmt.Printf("全局变量: int64 默认值:%v\n", i64)
  25. fmt.Printf("全局变量: uint 默认值:%v\n", ui)
  26. fmt.Printf("全局变量: uint8 默认值:%v\n", ui8)
  27. fmt.Printf("全局变量: uint16 默认值:%v\n", ui16)
  28. fmt.Printf("全局变量: uint32 默认值:%v\n", ui32)
  29. fmt.Printf("全局变量: uint64 默认值:%v\n", ui64)
  30. fmt.Printf("全局变量: uint64 默认值:%v\n", ui64)
  31. fmt.Printf("全局变量: float32 默认值:%v\n", f32)
  32. fmt.Printf("全局变量: float64 默认值:%v\n", f64)
  33. fmt.Printf("全局变量: string 默认值:%v\n", s)
  34. }

输出结果:

全局变量: bool 默认值:false

全局变量: int 默认值:0

全局变量: int8 默认值:0

全局变量: int16 默认值:0

全局变量: int32 默认值:0

全局变量: int64 默认值:0

全局变量: int64 默认值:0

全局变量: uint 默认值:0

全局变量: uint8 默认值:0

全局变量: uint16 默认值:0

全局变量: uint32 默认值:0

全局变量: uint64 默认值:0

全局变量: uint64 默认值:0

全局变量: float32 默认值:0

全局变量: float64 默认值:0

全局变量: string 默认值:

局部:

  1. package main
  2. import "fmt"
  3. func main() {
  4. var b bool
  5. var i int
  6. var i8 int8
  7. var i16 int16
  8. var i32 int32
  9. var i64 int64
  10. var ui uint
  11. var ui8 uint8
  12. var ui16 uint16
  13. var ui32 uint32
  14. var ui64 uint64
  15. var f32 float32
  16. var f64 float64
  17. var s string
  18. fmt.Printf("局部变量: bool 默认值:%v\n", b)
  19. fmt.Printf("局部变量: int 默认值:%v\n", i)
  20. fmt.Printf("局部变量: int8 默认值:%v\n", i8)
  21. fmt.Printf("局部变量: int16 默认值:%v\n", i16)
  22. fmt.Printf("局部变量: int32 默认值:%v\n", i32)
  23. fmt.Printf("局部变量: int64 默认值:%v\n", i64)
  24. fmt.Printf("局部变量: int64 默认值:%v\n", i64)
  25. fmt.Printf("局部变量: uint 默认值:%v\n", ui)
  26. fmt.Printf("局部变量: uint8 默认值:%v\n", ui8)
  27. fmt.Printf("局部变量: uint16 默认值:%v\n", ui16)
  28. fmt.Printf("局部变量: uint32 默认值:%v\n", ui32)
  29. fmt.Printf("局部变量: uint64 默认值:%v\n", ui64)
  30. fmt.Printf("局部变量: uint64 默认值:%v\n", ui64)
  31. fmt.Printf("局部变量: float32 默认值:%v\n", f32)
  32. fmt.Printf("局部变量: float64 默认值:%v\n", f64)
  33. fmt.Printf("局部变量: string 默认值:%v\n", s)
  34. }

输出结果:

局部变量: bool 默认值:false

局部变量: int 默认值:0

局部变量: int8 默认值:0

局部变量: int16 默认值:0

局部变量: int32 默认值:0

局部变量: int64 默认值:0

局部变量: int64 默认值:0

局部变量: uint 默认值:0

局部变量: uint8 默认值:0

局部变量: uint16 默认值:0

局部变量: uint32 默认值:0

局部变量: uint64 默认值:0

局部变量: uint64 默认值:0

局部变量: float32 默认值:0

局部变量: float64 默认值:0

局部变量: string 默认值:

本文标签:变量 初始化变量 短声明变量 局部变量 全局变量 形式参数