1 声明
Go语言的变量声明方式与C和C++语言有明显的不同。对于纯粹的变量声明,Go语言引入了 关键字var,而类型信息放在变量名之后
var v1 int
var v2 string
var v3 [10]int // 数组
var v4 []int // 数组切片
var v5 struct {
f int
}
var v6 *int // 指针
var v7 map[string]int // map,key为string类型,value为int类型
var v8 func(a int) int
var关键字的另一种用法是可以将若干个需要声明的变量放置在一起,免得程序员需要重复 写var关键字
var (
v1 int
v2 string
)
2 初始化
var v1 int = 10 // 正确的使用方式1
var v2 = 10 // 正确的使用方式2,编译器可以自动推导出v2的类型
v3 := 10 // 正确的使用方式3,编译器可以自动推导出v3的类型
3 赋值
var v10 int
v10 = 123
Go语言中提供了C/C++程序员期盼多年的多重赋值功 能,比如下面这个交换i和j变量的语句
i, j = j, i
4 匿名变量
func GetName() (firstName, lastName, nickName string) {
return "May", "Chan", "Chibi Maruko"
}
若只想获得nickName,则函数调用语句可以用如下方式编写:
_, _, 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
var v1 bool
v1 = true
v2 := (1 == 2) // v2也会被推导为bool类型
布尔类型不能接受其他类型的赋值,不支持自动或强制的类型转换。
# 以下是错误用法
var b bool
b = 1 // 编译错误
b = bool(1) // 编译错误
# 以下是正确用法
var b bool
b = (1 != 0)
(2) 整型
(3) 浮点数
Go语言定义了两个类型 float32 和 float64 ,
- float32 等价于C语言的 float 类型,
- float64 等价于C语言的 double 类型。
需要注意的是, fvalue2 其类型将被自动设为 float64, 而不管赋给它的数字是否是用32位长度表示的var fvalue1 float32
fvalue1 = 12
fvalue2 := 12.0 // 如果不加小数点,fvalue2会被推导为整型而不是浮点型
因此,对于以上的例子,下面的赋值将导致编译错误
因为浮点数不是一种精确的表达方式,所以像整型那样直接用 == 来判断两个浮点数是否相等是不可行的,这可能会导致不稳定的结果。fvalue1 = fvalue2
// 而必须使用这样的强制类型转换:
fvalue1 = float32(fvalue2)
import "math"
// p为用户自定义的比较精度,比如0.00001
func IsEqual(f1, f2, p float64) bool {
return math.Fdim(f1, f2) < p
}
(4) 复数
复数实际上由两个实数(在计算机中用浮点数表示)构成,一个表示实部(real),一个表示虚部(imag)。
对于一个复数 z = complex(x, y) ,可通过Go语言内置函数 real(z) 获得该复数的实部,通过 imag(z) 获得该复数的虚部。var value1 complex64 // 由2个float32构成的复数类型
value1 = 3.2 + 12i
value2 := 3.2 + 12i // value2是complex128类型
value3 := complex(3.2, 12) // value3结果同 value2