1 声明

Go语言的变量声明方式与C和C++语言有明显的不同。对于纯粹的变量声明,Go语言引入了 关键字var,而类型信息放在变量名之后

  1. var v1 int
  2. var v2 string
  3. var v3 [10]int // 数组
  4. var v4 []int // 数组切片
  5. var v5 struct {
  6. f int
  7. }
  8. var v6 *int // 指针
  9. var v7 map[string]int // map,key为string类型,value为int类型
  10. var v8 func(a int) int

var关键字的另一种用法是可以将若干个需要声明的变量放置在一起,免得程序员需要重复 写var关键字

  1. var (
  2. v1 int
  3. v2 string
  4. )

2 初始化

  1. var v1 int = 10 // 正确的使用方式1
  2. var v2 = 10 // 正确的使用方式2,编译器可以自动推导出v2的类型
  3. v3 := 10 // 正确的使用方式3,编译器可以自动推导出v3的类型

3 赋值

  1. var v10 int
  2. v10 = 123

Go语言中提供了C/C++程序员期盼多年的多重赋值功 能,比如下面这个交换i和j变量的语句

  1. i, j = j, i

4 匿名变量

  1. func GetName() (firstName, lastName, nickName string) {
  2. return "May", "Chan", "Chibi Maruko"
  3. }

若只想获得nickName,则函数调用语句可以用如下方式编写:

  1. _, _, nickName := GetName()

5 基础变量类型 与 复合变量类型

Go语言内置以下这些基础类型:

  • 布尔类型:bool。
  • 整型:int8、byte、int16、int、uint、uintptr等。 
  • 浮点类型:float32、float64。
  • 复数类型:complex64、complex128。 
  • 字符串:string。
  • 字符类型:rune。
  • 错误类型:error。

此外,Go语言也支持以下这些复合类型: 

  • 指针(pointer)
  • 数组(array)
  • 切片(slice)
  • 字典(map)
  • 通道(chan)
  • 结构体(struct)
  • 接口(interface)

对于常规的开发来说,用int 和uint就可以了,没必要用int8之类明确指定长度的类型,以免导致移植困难。

(1) bool

  1. var v1 bool
  2. v1 = true
  3. v2 := (1 == 2) // v2也会被推导为bool类型

布尔类型不能接受其他类型的赋值,不支持自动或强制的类型转换。

  1. # 以下是错误用法
  2. var b bool
  3. b = 1 // 编译错误
  4. b = bool(1) // 编译错误
  5. # 以下是正确用法
  6. var b bool
  7. b = (1 != 0)

(2) 整型

Go语言支持如下类型
image.png

(3) 浮点数

Go语言定义了两个类型 float32 和 float64 ,

  • float32 等价于C语言的 float 类型,
  • float64 等价于C语言的 double 类型。
    1. var fvalue1 float32
    2. fvalue1 = 12
    3. fvalue2 := 12.0 // 如果不加小数点,fvalue2会被推导为整型而不是浮点型
    需要注意的是, fvalue2 其类型将被自动设为 float64, 而不管赋给它的数字是否是用32位长度表示的
    因此,对于以上的例子,下面的赋值将导致编译错误
    1. fvalue1 = fvalue2
    2. // 而必须使用这样的强制类型转换:
    3. fvalue1 = float32(fvalue2)
    因为浮点数不是一种精确的表达方式,所以像整型那样直接用 == 来判断两个浮点数是否相等是不可行的,这可能会导致不稳定的结果。
    1. import "math"
    2. // p为用户自定义的比较精度,比如0.00001
    3. func IsEqual(f1, f2, p float64) bool {
    4. return math.Fdim(f1, f2) < p
    5. }

    (4) 复数

    复数实际上由两个实数(在计算机中用浮点数表示)构成,一个表示实部(real),一个表示虚部(imag)。
    1. var value1 complex64 // 由2个float32构成的复数类型
    2. value1 = 3.2 + 12i
    3. value2 := 3.2 + 12i // value2是complex128类型
    4. value3 := complex(3.2, 12) // value3结果同 value2
    对于一个复数 z = complex(x, y) ,可通过Go语言内置函数 real(z) 获得该复数的实部,通过 imag(z) 获得该复数的虚部。