kagxin / blog

个人博客:技术、随笔、生活
https://github.com/kagxin/blog/issues
7 stars 0 forks source link

golang 的零值 #64

Open kagxin opened 4 years ago

kagxin commented 4 years ago

golang的零值

golang中的变量未显式初始化时,会赋予一个默认的零值

常见类型零值

类型 零值
int,float,complex 0
bool false
string ""
slice nil
map nil
pointer nil
func nil
interface nil
channel nil

自定义结构体类型的零值

type Persion struct {
    Name  string
    Age   int
    Hobby []string
}

func main() {
    var p Persion
    fmt.Printf("%#v", p)
}

输出:

main.Persion{Name:"", Age:0, Hobby:[]string(nil)}

结构体的默认值为各成员的零值

切片的零值和append的行为

package main

import "fmt"

func main() {
    var stringSli []string
    if stringSli == nil {
        fmt.Println("stringSli is nil")
    }
    fmt.Printf("stringSli is %#v\n", stringSli)
    stringSli2 := append(stringSli, []string{"hello", "world"}...)
    fmt.Printf("stringSli is %#v, stringScli2 is %#v\n", stringSli, stringSli2)
}

输出:

stringSli is nil
stringSli is []string(nil)
stringSli is []string(nil), stringScli2 is []string{"hello", "world"}

切片的零值是nil。使用append函数,可以给零值sclie追加元素最佳元素。 If it has sufficient capacity, the destination is resliced to accommodate the new elements. If it does not, a new underlying array will be allocated. 零值切片的lencap为0,append会动态生成一个底层数组,来容纳追加的元素

channel的零值

channel的零值也为nil

package main

import "fmt"

func main() {
    var ch chan int
    if ch == nil {
        fmt.Printf("ch is %#v", ch)
    }
}
零值的channel的行为: 操作 效果
close(ch) panic
ch<-v 阻塞
v, ok=<-ch 阻塞

所以使用channel的时候,最好使用make函数显示初始化, 除非我们知道自己在做什么