go - 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}
}
...
}
解决方案
如果结构或数组类型不包含大小大于零的字段(或元素),则其大小为零。两个不同的零大小变量在内存中可能具有相同的地址。
例如,
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
推荐阅读
- flutter - Flutter web,带有图标和数字的堆栈
- php - 具有特定字符串的 Woocommerce 标签列表
- java - Java InternetAddress 未正确验证电子邮件
- azure - 使用 Azure 逻辑应用将消息主题添加到 AS2 编码消息
- javascript - 在 url 中的路径名之后获取查询字符串
- swift - 从 Xcode(Swift)中的按钮 IB 函数将时间戳打印到标签
- c# - 如何将 C# 中的 DataGridView 连接到 SQL 数据库?
- powerapps - 使用 Powerapps 从 SQL Server 获取大数据并写入 Azure Blob 存储
- regex - 匹配字符(如果存在),否则继续
- python - 使用 Selenium 的 WhatsApp 自动化