如何检查切片标头?

时间:2019-01-15 09:19:07

标签: go slice

这是来自slices

的经过稍微修改的代码
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))
}

它表示slice参数的内容可以由函数修改,但其标头不能。 如何在屏幕上打印newSlice2的标题?

1 个答案:

答案 0 :(得分:9)

切片标头由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}

查看相关问题:

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