这是来自切片的略微修改的代码var buffer [256] bytefunc SubtractOneFromLength(slice []byte) []byte { slice = slice[0 : len(slice)-1] return slice}func main() { slice := buffer[10:20] fmt.Println("Before: len(slice) =", len(slice)) newSlice := SubtractOneFromLength(slice) fmt.Println("After: len(slice) =", len(slice)) fmt.Println("After: len(newSlice) =", len(newSlice)) newSlice2 := SubtractOneFromLength(newSlice) fmt.Println("After: len(newSlice2) =", len(newSlice2))}它说切片参数的内容可以被函数修改,但它的头不能。如何在我的屏幕上打印 newSlice2 的标题?
1 回答
凤凰求蛊
TA贡献1825条经验 获得超4个赞
切片头由以下类型表示reflect.SliceHeader
:
type SliceHeader struct { Data uintptr Len int Cap int}
您可以使用 packageunsafe
将切片指针转换为*reflect.SliceHeader
如下所示:
sh := (*reflect.SliceHeader)(unsafe.Pointer(&newSlice2))
然后你可以像任何其他结构一样打印它:
fmt.Printf("%+v", sh)
输出将是(在Go Playground上尝试):
&{Data:1792106 Len:8 Cap:246}
unsafe
另请注意,您可以在不使用 package and 的情况下访问存储在切片标头中的信息reflect
:
要获得该
Data
字段,您可以使用&newSlice2[0]
要获取
Len
字段,请使用len(newSlice2)
要获取
Cap
字段,请使用cap(newSlice2)
- 1 回答
- 0 关注
- 106 浏览
添加回答
举报
0/150
提交
取消