golang сталкиваются с вопросами: строка превращается в массив байтов, произойдет ли копирование памяти?

Go

вопрос

Преобразовать строку в массив байтов, произойдет ли копирование памяти?

как ответить

Строки преобразуются в фрагменты, которые будут генерировать копии. Строго говоря, копирование памяти происходит всякий раз, когда происходит приведение типа. Итак, вот в чем проблема.
Частые операции копирования памяти не кажутся эффективными.Есть ли способ преобразовать строку в фрагмент, не копируя ее?

Код

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. Пройти еще раз*к фактическому содержимому, на которое указывает указатель.

Рекомендуемые статьи:

Если вы хотите, чтобы узнать очко знаний каждый день?