首页 > 解决方案 > golang 切片中哪种类型的大小为零?

问题描述

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

看了golang slice的源码,发现代码et.size == 0,所以想知道哪个类型的size是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}
    }
    ...
}

标签: goslice

解决方案


Go 编程语言规范

尺寸和对齐保证

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


例如,

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

推荐阅读