登录
首页 >  Golang >  Go问答

如何验证切片的开头部分?

来源:stackoverflow

时间:2024-03-08 13:21:26 131浏览 收藏

编程并不是一个机械性的工作,而是需要有思考,有创新的工作,语法是固定的,但解决问题的思路则是依靠人的思维,这就需要我们坚持学习和更新自己的知识。今天golang学习网就整理分享《如何验证切片的开头部分?》,文章讲解的知识点主要包括,如果你对Golang方面的知识点感兴趣,就不要错过golang学习网,在这可以对大家的知识积累有所帮助,助力开发能力的提升。

问题内容

这是对切片稍作修改的代码

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


解决方案


切片头由reflect.SliceHeader类型表示:

type sliceheader struct {
        data uintptr
        len  int
        cap  int
}

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

sh := (*reflect.sliceheader)(unsafe.pointer(&newslice2))

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

fmt.printf("%+v", sh)

输出将为(在 Go Playground 上尝试):

&{Data:1792106 Len:8 Cap:246}

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

  • 要获取 data 字段,您可以使用 &newslice2[0]
  • 要获取 len 字段,请使用 len(newslice2)
  • 要获取 cap 字段,请使用 cap(newslice2)

请参阅修改后的 Go Playground 示例,该示例显示这些值与切片标头中的值相同。

查看相关问题:

How to create an array or a slice from an array unsafe.Pointer in golang?

nil slices vs non-nil slices vs empty slices in Go language

以上就是《如何验证切片的开头部分?》的详细内容,更多关于的资料请关注golang学习网公众号!

声明:本文转载于:stackoverflow 如有侵犯,请联系study_golang@163.com删除
相关阅读
更多>
最新阅读
更多>
课程推荐
更多>