вопрос
Преобразовать строку в массив байтов, произойдет ли копирование памяти?
как ответить
Строки преобразуются в фрагменты, которые будут генерировать копии. Строго говоря, копирование памяти происходит всякий раз, когда происходит приведение типа. Итак, вот в чем проблема.
Частые операции копирования памяти не кажутся эффективными.Есть ли способ преобразовать строку в фрагмент, не копируя ее?
Код
package main
import (
"fmt"
"reflect"
"unsafe"
)
func main() {
a :="aaa"
ssh := *(*reflect.StringHeader)(unsafe.Pointer(&a))
b := *(*[]byte)(unsafe.Pointer(&ssh))
fmt.Printf("%v",b)
}
объяснять
-
StringHeader
да字符串
Базовая структура в go.
type StringHeader struct {
Data uintptr
Len int
}
-
SliceHeader
да切片
Базовая структура в go.
type SliceHeader struct {
Data uintptr
Len int
Cap int
}
- Затем, если вы хотите преобразовать два внизу, просто поместите
StringHeader
адрес переданSliceHeader
Просто сделай это. Так что имейте сильный пакет под названиемunsafe
.-
1.
unsafe.Pointer(&a)
способ получить переменнуюa
адрес г. -
2.
(*reflect.StringHeader)(unsafe.Pointer(&a))
Строка a может быть преобразована в форму базовой структуры. -
3.
(*[]byte)(unsafe.Pointer(&ssh))
Указатель, который может преобразовать базовую структуру ssh в байтовый срез. -
4. Пройти еще раз
*
к фактическому содержимому, на которое указывает указатель.
-
Рекомендуемые статьи:
- Вопросы для интервью с Голангом: просто поговорить о побеге из памяти?
- Вопрос из интервью с Golang: будет ли происходить копирование памяти при преобразовании строки в массив байтов?
- golang вопросы интервью: флип содержит
中文、数字、英文字母
Нить - Вопрос из интервью с Golang: копировать большой фрагмент дороже, чем маленький?
- Вопросы для интервью с Golang: можете ли вы рассказать о разнице между uintptr и unsafe.Pointer?