👣 Почему reflect и unsafe выводит разные значения у одного объекта в Golang?



Рассмотрим код:



package main



import (

"fmt"

"reflect"

"unsafe"

)



func main() {

s := "hello, world!"

hello := s[:5]

world := s[7:]

fmt.Printf("s = %s, sh = %v, sp = %d\n",

s,

*(*reflect.StringHeader)(unsafe.Pointer(&s)),

reflect.ValueOf(&s).Pointer(),

)



fmt.Printf("hello = %s, helloh = %v, hellop = %d\n",

hello,

*(*reflect.StringHeader)(unsafe.Pointer(&hello)),

reflect.ValueOf(&hello).Pointer(),

)



fmt.Printf("world = %s, worldh = %v, worldp = %d\n",

world,

*(*reflect.StringHeader)(unsafe.Pointer(&world)),

reflect.ValueOf(&world).Pointer(),

)



slice := []int{1, 2, 3, 4, 5, 6, 7, 8, 9, 10}

s1 := slice[:5]

s2 := slice[4:]

fmt.Printf("slice = %v, sh = %v, sp = %d\n",

slice,

*(*reflect.SliceHeader)(unsafe.Pointer(&slice)),

reflect.ValueOf(slice).Pointer(),

)



fmt.Printf("s1 = %v, s1h = %v, s1p = %d\n",

s1,

*(*reflect.SliceHeader)(unsafe.Pointer(&s1)),

reflect.ValueOf(s1).Pointer(),

)



fmt.Printf("s2 = %v, s2h = %v, s2p = %d\n",

s2,

*(*reflect.SliceHeader)(unsafe.Pointer(&s2)),

reflect.ValueOf(s2).Pointer(),

)

}

вывод



s = hello, world!, sh = {4817792 13}, sp = 824633786960

hello = hello, helloh = {4817792 5}, hellop = 824633786976

world = world!, worldh = {4817799 6}, worldp = 824633786992



slice = [1 2 3 4 5 6 7 8 9 10], sh = {824633860176 10 10}, sp = 824633860176

s1 = [1 2 3 4 5], s1h = {824633860176 5 10}, s1p = 824633860176

s2 = [5 6 7 8 9 10], s2h = {824633860208 6 6}, s2p = 824633860208



В случае со строкой, выводится другой sh от Pointer() 4817792 и 824633786960 (для примера), в то время как в слайсах они одинаковые.



Почему в данном случае у s и hello одинаковые sh - 4817792, а у world отличается, при том ,что по сути это срез исходной строки?



Тот же вопрос и про слайсы. Что значат эти числа?



Ответ



Пишите свой ответ в комментариях👇



@golang_interview