Функция unsafe.String
Функция unsafe.String создает строку из указателя на данные и длины.
Первый параметр — указатель на первый байт данных (тип *byte),
второй — длина создаваемой строки (тип int).
Важно отметить, что эта функция не создает копию данных,
а возвращает строку, которая разделяет память с исходными данными.
Синтаксис
unsafe.String(ptr *byte, len int) string
Пример '1' - преобразование массива байтов в строку
Давайте создадим строку из массива байтов:
package main
import (
"fmt"
"unsafe"
)
func main() {
data := []byte{97, 98, 99, 100, 101}
ptr := &data[0]
res := unsafe.String(ptr, len(data))
fmt.Println(res)
}
Результат выполнения кода:
"abcde"
Пример '2' - создание строки из части данных
Создадим строку только из первых трех байтов:
package main
import (
"fmt"
"unsafe"
)
func main() {
data := []byte{97, 98, 99, 100, 101}
ptr := &data[0]
res := unsafe.String(ptr, 3)
fmt.Println(res)
}
Результат выполнения кода:
"abc"
Пример '3' - использование с нулевым указателем
Функция позволяет создать пустую строку при длине 0:
package main
import (
"fmt"
"unsafe"
)
func main() {
var ptr *byte
res := unsafe.String(ptr, 0)
fmt.Println(res == "")
}
Результат выполнения кода:
"true"
Пример '4' - изменение исходных данных
Поскольку строка разделяет память с исходными данными, изменение данных повлияет на строку:
package main
import (
"fmt"
"unsafe"
)
func main() {
data := []byte{97, 98, 99}
ptr := &data[0]
res := unsafe.String(ptr, len(data))
fmt.Println(res)
data[0] = 122
fmt.Println(res)
}
Результат выполнения кода:
"abc"
"zbc"
Смотрите также
-
функцию
unsafe.StringData,
которая возвращает указатель на данные строки -
функцию
unsafe.Slice,
которая создает слайс из указателя и длины -
функцию
unsafe.SliceData,
которая возвращает указатель на данные слайса -
функцию
unsafe.Sizeof,
которая возвращает размер значения в байтах