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

原理
  1. 作用于slice和数组都是提前计算好长度,并且遍历的值用的同一个
  2. 作用于map时,遍历过程中新插入的值有可能会被遍历,有可能不会
  3. 作用于string时, index是byte索引, value是rune

xxx小M
30 声望11 粉丝

暂时放一些读书笔记, 很多内容没有整理好