Рассмотрим код:
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