channel
nil和close channel
读写nil均会阻塞。关闭的管道仍然可以读取数据(包括select也会选中),向关闭的管道写数据会处触发panic
slice
make slice
s := make([]int, 10, 100) a := new([]int)
fmt.Println(*a == nil) // true
b := make([]int, 0)
fmt.Println(b == nil) // true
var c []int
fmt.Println(c == nil) // false切取
有两种表达方式:
a[low:hight]
a[low:high:max] // 其中max表示容量a是数组和slice都会生成slice,如果a是字符串那么会生成字符串
数据结构
var a []int
type SliceHeader struct {
Data uintptr // 0
Len int // 0
Cap int // 0
}var a = make([]int, 0)
var b = []int{}
type SliceHeader struct {
Data uintptr // 指向8字节内容
Len int // 0
Cap int // 0
}string
utf-8
func testString() {
a := "你好"
fmt.Println(len(a)) // 6
for i, c := range a {
fmt.Println(i, c, string(c)) // c是int32
// 0 20320 你
// 3 22909 好
}
}for-range
原理
- 作用于slice和数组都是提前计算好长度,并且遍历的值用的同一个
- 作用于map时,遍历过程中新插入的值有可能会被遍历,有可能不会
- 作用于string时, index是byte索引, value是rune