В следующем коде:
c := "fool"
d := []byte("fool")
fmt.Printf("c: %T, %d\n", c, unsafe.Sizeof(c)) // 16 bytes
fmt.Printf("d: %T, %d\n", d, unsafe.Sizeof(d)) // 24 bytes
Чтобы определить тип данных, необходимый для получения данных JSON из CloudFoundry, я тестирую приведенный выше пример кода, чтобы понять распределение памяти для типа []byte
против string
.
Ожидаемый размер string
переменной типа c
равен 1 байту x 4 буквы в кодировке ascii = 4 байта, но размер показывает 16 байтов.
Для переменной типа byte
d
GO встраивает строку в исполняемую программу как строковый литерал. Он преобразует строковый литерал в фрагмент байта во время выполнения с помощью функции runtime.stringtoslicebyte
. Что-то вроде ... []byte{102, 111, 111, 108}
Ожидаемый размер переменной типа byte
d
снова равен 1 байту x 4 значения ascii = 4 байта, но размер переменной d
показывает 24 байта как основную емкость массива.
Почему размер обеих переменных не равен 4 байтам?