annidy / notes

0 stars 0 forks source link

操作空值map、slice、chan #306

Open annidy opened 1 month ago

annidy commented 1 month ago

我们都知道map、slice、chan需要通过make创建,默认都是空值。

  1. map空值不能添加元素,其它都可以
  2. slice空值可以append元素
  3. chan空值不能close。读取一个空chan会一直阻塞
func main() {
    var m map[int]int
    fmt.Println("len", len(m))
    for k, v := range m {
        fmt.Println(k, v)
    }
    if a, ok := m[1]; ok {
        fmt.Println(a)
    }
    fmt.Println("del")
    delete(m, 1)
        // m[1] = 1        // error: panic: assignment to entry in nil map

    var s []int
    fmt.Println("len", len(s))
    for i, v := range s {
        fmt.Println(i, v)
    }
    fmt.Println("del")
    s = s[:0]

    var s2 [1]int
    copy(s2[:], s)

        var s3 []int
        s3 = append(s3, 1)
        fmt.Println(s3[0])

    var ch chan int
    fmt.Println("len", len(ch))
    go func() {
        fmt.Println("range ch")
        for v := range ch {
            fmt.Println(v)
        }
    }()

    go func() {
        fmt.Println("recv ch")
        if v, ok := <-ch; ok {
            fmt.Println(v)
        }
    }()

    // 下面的代码会出现 panic: close of nil channel
    // close(ch)
    time.Sleep(time.Second)
}