如何检查切片头?

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

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


萧十郎
浏览 187回答 1
1回答

凤凰求蛊

切片头由以下类型表示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)
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Go