为了账号安全,请及时绑定邮箱和手机立即绑定

如何检查切片头?

如何检查切片头?

Go
萧十郎 2023-06-01 15:14:10
这是来自切片的略微修改的代码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)

查看完整回答
反对 回复 2023-06-01
  • 1 回答
  • 0 关注
  • 106 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信