美文网首页
go 的零值总结

go 的零值总结

作者: wayyyy | 来源:发表于2022-09-07 01:30 被阅读0次

    面试中经常遇到,特此总结一下。

    bool int float string 零值
    func main() {
       var i int
       var f float64
       var b bool
       var s string
       fmt.Printf("%v %v %v %q\n", i, f, b, s)
    }
    

    输出:

    image.png
    指针 零值
    slice 零值

    slice 的零值是nil

    var s1 []string  
    

    nil slice 的 len 和 cap 都为 0

    func main() {
        var s1 []string  
        fmt.Println("len:", len(s1), "cap:", cap(s1))
    }
    
    image.png

    但是 nil slice 追加是安全的

    func main() {
        var s1 []string  
        s1 = append(s1, "hello")    
    }
    
    map 零值

    map 的零值是nil

    var m map[string]int  
    

    nil map 的 len 为0

    func main() {
        var m map[string]int 
        fmt.Println("len:", len(m))   
    }
    
    image.png

    同时,在对一个 nil map 进行插入会导致 panic

    func main() {
        var m map[string]int 
        m["tom"] = 12    // panic
    }
    

    但是查找和删除是安全的。

    func main() {
        var m map[string]int
        v, exist := m["tom"]
        if exist {
            fmt.Println(v)
        } else {
            fmt.Println("not found")
        }
    
        delete(m, "tom")
    }
    
    channel 零值

    channel 的零值是nil

    var a chan int   // nil 通道
    

    读写一个 nil channel 会一直阻塞。

    function 零值

    TODO

    nil

    nil 是go语言中预先定义的标识符,不是关键字或保留字。这可以让我们直接定义一个名称为 nil 的变量(并不推荐这样做),比如下面这样:

    var nil = errors.New("nil")
    

    不同类型的nil值占用的内存大小可能是不一样的:

    var p *struct{} = nil
    fmt.Println(unsafe.Sizeof(p)) // 8
    
    var s []int = nil
    fmt.Println(unsafe.Sizeof(s)) // 24
    
    var m map[int]bool = nil
    fmt.Println(unsafe.Sizeof(m)) // 8
    
    go为什么需要零值机制?

    1、将一个值设置为已知默认值的特性,对于程序的安全性和正确性非常重要。
    2、零值机制使得 sync.Mutex,slices等无需显式初始化就可以使用,开箱即用。
    3、同时还可以使你的 Go 程序更加简单和紧凑。

    相关文章

      网友评论

          本文标题:go 的零值总结

          本文链接:https://www.haomeiwen.com/subject/tbewnrtx.html