Функция unsafe.StringData
Функция unsafe.StringData из пакета unsafe возвращает указатель на первый байт строки,
представленный как unsafe.Pointer. В первый параметр передается строка,
для которой нужно получить указатель на ее байтовые данные.
Эта функция полезна при работе с низкоуровневыми операциями,
когда требуется прямой доступ к содержимому строки без копирования.
Важно понимать, что полученный указатель действителен только до тех пор, пока строка существует в памяти и не была перемещена сборщиком мусора. Использование возвращенного указателя после того, как строка вышла из области видимости, может привести к неопределенному поведению.
Синтаксис
unsafe.StringData(str)
Пример
Давайте получим указатель на данные строки и выведем значение первого байта:
package main
import (
"fmt"
"unsafe"
)
func main() {
str := "hello"
ptr := unsafe.StringData(str)
b := (*byte)(ptr)
fmt.Printf("%c\n", *b)
}
Результат выполнения кода:
"h"
Пример
Давайте получим указатель на данные строки и преобразуем их в слайс байтов для чтения:
package main
import (
"fmt"
"unsafe"
)
func main() {
str := "12345"
ptr := unsafe.StringData(str)
bytes := unsafe.Slice(ptr, len(str))
fmt.Printf("%v\n", bytes)
}
Результат выполнения кода:
[49 50 51 52 53]
Пример
Давайте используем unsafe.StringData для сравнения двух строк без копирования:
package 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")
}
}
Результат выполнения кода:
"Strings share same memory"
Смотрите также
-
функцию
unsafe.String,
которая создает строку из указателя и длины -
функцию
unsafe.SliceData,
которая возвращает указатель на данные слайса -
тип
unsafe.Pointer,
который представляет указатель для низкоуровневых операций -
функцию
reflect.Value.String,
которая возвращает строковое значение из рефлексии