Функция unsafe.StringData

Функция unsafe.StringData из пакета unsafe возвращает указатель на первый байт строки, представленный как unsafe.Pointer. В первый параметр передается строка, для которой нужно получить указатель на ее байтовые данные. Эта функция полезна при работе с низкоуровневыми операциями, когда требуется прямой доступ к содержимому строки без копирования.

Важно понимать, что полученный указатель действителен только до тех пор, пока строка существует в памяти и не была перемещена сборщиком мусора. Использование возвращенного указателя после того, как строка вышла из области видимости, может привести к неопределенному поведению.

Синтаксис

gounsafe.StringData(str)

Пример

Давайте получим указатель на данные строки и выведем значение первого байта:

gopackage main

import (
  "fmt"
  "unsafe"
)

func main() {
  str := "hello"
  ptr := unsafe.StringData(str)
  b := (*byte)(ptr)
  fmt.Printf("%c\n", *b)
}

Результат выполнения кода:

go"h"

Пример

Давайте получим указатель на данные строки и преобразуем их в слайс байтов для чтения:

gopackage main

import (
  "fmt"
  "unsafe"
)

func main() {
  str := "12345"
  ptr := unsafe.StringData(str)
  bytes := unsafe.Slice(ptr, len(str))
  fmt.Printf("%v\n", bytes)
}

Результат выполнения кода:

go[49 50 51 52 53]

Пример

Давайте используем unsafe.StringData для сравнения двух строк без копирования:

gopackage main

import (
  "fmt"
  "unsafe"
)

func main() {
  str1 := "abcde"
  str2 := "abcde"
  
  ptr1 := unsafe.StringData(str1)
  ptr2 := unsafe.StringData(str2)
  
  if ptr1 == ptr2 {
    fmt.Println("Strings share same memory")
  } else {
    fmt.Println("Strings have different memory")
  }
}

Результат выполнения кода:

go"Strings share same memory"

Смотрите также

  • функцию unsafe.String,
    которая создает строку из указателя и длины
  • функцию unsafe.SliceData,
    которая возвращает указатель на данные слайса
  • тип unsafe.Pointer,
    который представляет указатель для низкоуровневых операций
  • функцию reflect.Value.String,
    которая возвращает строковое значение из рефлексии