首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何检查切片头?

如何检查切片头?
EN

Stack Overflow用户
提问于 2019-01-15 09:19:07
回答 1查看 3.2K关注 0票数 10

这是来自切片的稍微修改过的代码

代码语言:javascript
复制
var buffer [256] byte

func 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的标题?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2019-01-15 09:29:01

片头由reflect.SliceHeader类型表示:

代码语言:javascript
复制
type SliceHeader struct {
        Data uintptr
        Len  int
        Cap  int
}

您可以使用包unsafe将片指针转换为*reflect.SliceHeader,如下所示:

代码语言:javascript
复制
sh := (*reflect.SliceHeader)(unsafe.Pointer(&newSlice2))

然后你可以像其他任何结构一样打印它:

代码语言:javascript
复制
fmt.Printf("%+v", sh)

输出将是(在围棋游乐场上尝试):

代码语言:javascript
复制
&{Data:1792106 Len:8 Cap:246}

还要注意,您可以访问存储在片头中的信息,而无需使用包unsafereflect

  • 要获得Data字段,可以使用&newSlice2[0]
  • 要获取Len字段,请使用len(newSlice2)
  • 要获取Cap字段,请使用cap(newSlice2)

请参见修改后的围棋游乐场示例,该示例显示这些值与片头中的值相同。

见有关问题:

如何在戈朗中从数组unsafe.Pointer创建数组或切片?

Go语言中的零片vs非零片与空片

票数 25
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/54195834

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档