Go 语言中的许多常量并没有一个明确的基础类型,编译器为这些没有明确的基础类型的数字常量提供比基础类型更高精度的算术运算,可认为至少有 256bit 的运算精度。
1 2 3 4 5 6 7 8 9 10 11 12 13
type Color int const ( Black Color = iota//iota的初始值为0 Red ) functest(c Color) {} funcmain(){ c := Black test(c) x:=1 test(x) //报错 test(1) // 常量会被自动转换 }
go 作为编译型语言,不允许重复声明,但有一种特殊情况,即有新的变量被定义,如下
1 2
a := "hellp" a,b := "hel","world"
选择 循环结构
跟 for 一样,if 语句可以在条件之前执行一个简单的语句 由这个语句定义的变量的作用域仅在 if 范围之内。
go range 只有一个接收参数的时候遍历的是 index
go 中 range 会复制对象,k,v 都是从复制的对象中取出的,所以 a[k]和 v 实际是两个变量
1 2 3 4 5 6
a := [4]int{1, 2, 3, 4} for k, v := range a { a[k] = 4 a[k] = v + 1 fmt.Print(a[k]) }
输出: 2345
控制流 if 支持初始化语句,定义代码块局部变量
1 2 3
if a := 5; a > 4 { fmt.Println(a) }
带有 flag 的双重循环,可以实现准层数确的 continue 和 break
1 2 3 4 5 6 7 8 9 10 11 12 13 14
L1: for x := 0; x < 3; x++ { L2: for y := 0; y < 5; y++ { if y > 3 { continue L2 } if x > 1 { break L1 } print(x, ":", y, " ") } println() }
数组&&切片
make([]T, length, capacity)使用 make 创建切片
切片的 cap 为切片起始位置到底层数组末尾的长度
golan 数组传值默认使用值拷贝,但是会造成性能问题,通常会建议使用 slice 或者数组指针
内置函数 len 和 cap 都能返回数组长度
reslice 是在 slice 的基础上创建新的 slice 对象,新的对象依旧指向原先底层数组
append 是向 slice 尾部添加数据,返回新的 slice 对象,一旦超市原 slice 的 cap 就会重新分配底层数组
copy(dst,src)复制 slice,两个 slice 可以指向不同的数组
Map
map 查找,类型断言或者通道接受出现在赋值语句右边不一定是产生两个结果,也可能只产生一个结果
支持== !=等操作符 可用作 map 键类型 相等的判断依据是值相等而非指针相等
结构体可作为 map 的 key 和 value
1 2 3 4 5 6 7 8
type people struct { name string age int } m := map[int]people{ 1: {"user1", 10}, 2: {"user2", 20}, }