slice 初始化问题

```go 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

```go
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

要回复问题请先登录注册