slice 初始化问题

    var a []byte
    fmt.Println(a, len(a), cap(a))

    b := make([]byte, 0)
    fmt.Println(b, len(b), cap(b))

a 和 b 到底有什么区别

已邀请:

simple - 既要有梦想,又要有实力

赞同来自: lesliefang jtgogogo Mrwxj

    var a []byte
    fmt.Println(a, len(a), cap(a))
    fmt.Println(unsafe.Sizeof(a))   //24

    ah := (*reflect.SliceHeader)(unsafe.Pointer(&a))
    fmt.Println(ah.Data, ah.Len, ah.Cap)

    fmt.Println()
    b := make([]byte, 0)
    fmt.Println(b, len(b), cap(b))
    fmt.Println(unsafe.Sizeof(b))   //24

    bh := (*reflect.SliceHeader)(unsafe.Pointer(&b))
    fmt.Println(bh.Data, bh.Len, bh.Cap)

    var c struct{}
    fmt.Printf("bh.Data = 0x%x\n", bh.Data)
    fmt.Printf("&zerobase = %p\n", &c)

其实slice的底层结构在标准库reflect包中可以看到:
type SliceHeader struct { Data uintptr Len int Cap int }

这是在runtime源码包中的定义:
type slice struct { array unsafe.Pointer len int cap int } 两个结构体是一样的。变量a和b都是上面的结构,只是a的Data字段指向nil,而b的Data字段执行"零对象"(zerobase)

jtgogogo

赞同来自: c850241964 jimmyyem

可以认为a,b是两个指针变量,a的值为nil,不指向任何地址,b有值,指向一个字节数据,这个字节数据的len和cap都是0

要回复问题请先登录注册