golang切片中哪种类型的大小为零?
当我阅读golang slice的源代码时,我发现了一个代码et.size ==0。所以我想知道哪种类型的大小为0?
func growslice(et *_type, old slice, cap int) slice {
...
if et.size == 0 {
if cap < old.cap {
panic(errorString("growslice: cap out of range"))
}
return slice{unsafe.Pointer(&zerobase), old.len, cap}
}
...
}
答案 0 :(得分:2)
The Go Programming Language Specification
如果结构或数组类型不包含任何字段,则其大小为零(或 大小分别大于零的元素)。两个截然不同 零大小的变量在内存中的地址可能相同。
例如,
package main
import (
"fmt"
"unsafe"
)
func main() {
type zero struct{}
fmt.Println(unsafe.Sizeof(zero{}))
slice := make([]zero, 7)
fmt.Printf("%d %v %p %p\n", len(slice), slice, &slice[0], &slice[len(slice)-1])
}
游乐场:https://play.golang.org/p/pn8Rz0IorwD
输出:
0
7 [{} {} {} {} {} {} {}] 0x1c4c84 0x1c4c84