Как проверить заголовок среза? - PullRequest
0 голосов
/ 15 января 2019

Это слегка измененный код из ломтиков

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 на моем экране?

1 Ответ

0 голосов
/ 15 января 2019

Заголовок среза представлен типом 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}

Смотрите похожие вопросы:

Как создать массив или фрагмент из массива unsafe.Pointer in golang?

ноль ломтиков против не ноль ломтиков против пустых ломтиков на языке Go

...