golang切片中哪种类型的大小为零?

时间:2019-07-18 01:31:51

标签: go slice

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}
    }
    ...
}

1 个答案:

答案 0 :(得分:2)

  

The Go Programming Language Specification

     

Size and alignment guarantees

     

如果结构或数组类型不包含任何字段,则其大小为零(或   大小分别大于零的元素)。两个截然不同   零大小的变量在内存中的地址可能相同。


例如,

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