在围棋unsafe.SliceData函数的文档中,它说:

SliceData返回指向参数的基础数组的指针 切成薄片.

  • 如果cap(slice)为0,则SliceData返回&slice[:1][0].

返回&slice[:1][0]而不是&slice[0]背后的逻辑是什么?据我所知(和我的tests确认),两者都会返回相同的地址.围棋开发人员 Select 使用前者而不是后者有什么特别的原因吗?

推荐答案

一个切片可以具有正容量(cap(slice) > 0),但它可以同时具有0个长度.将其索引为slice[0]会导致运行时死机.

如果一个片的容量为正,您可以像slice[:1]那样对它进行切片,这将导致一个长度为1的片,并且您可以像result[0]那样对结果进行索引,而不会导致运行时死机.

例如:

slice := make([]int, 0, 5)
fmt.Println(&slice[0]) 

这将导致:

panic: runtime error: index out of range [0] with length 0

但这是可行的:

fmt.Println(&slice[:1][0])

Go相关问答推荐

Golang Viper:如果第一个字段不存在,如何从另一个字段获取值

使用ciph.AEAD.Seal()查看内存使用情况

GoFR HTTP服务初始化中Open遥测传输和超时配置的说明

如何防止程序B存档/删除围棋中程序A当前打开的文件?

如何在VSCode中为特定的.go文件创建调试配置?

在整个SQL事务中将使用上下文作为默认设置吗?

如何在Golang中覆盖404

golang 上基于标头的版本控制

MQTT 客户端没有收到另一个客户端发送的消息

如何使用 go-git 将特定分支推送到远程

如何使用 GolangCI 删除未使用的导入

判断一个区域内的纬度/经度点

Get 请求在 Thunder 客户端/Postman 中返回数据,但在 Golang 代码中给出空白数据

有没有什么方法可以在不使用 if/else 的情况下在 Golang 中处理 nil 指针?

GoReleaser 和 ssh-agent Github 操作:为什么无法读取用户名...终端提示已禁用?

从golang中的url加载图像

将未知长度切片的值分配给Go中的 struct ?

如何排除溢出矩阵的坐标

为什么 Go 中的 maps.Keys() 将 map 类型指定为 M?

在 VSCode 中使用命令行参数调试 Go 测试