Функция unsafe.String

Функция unsafe.String создает строку из указателя на данные и длины. Первый параметр — указатель на первый байт данных (тип *byte), второй — длина создаваемой строки (тип int). Важно отметить, что эта функция не создает копию данных, а возвращает строку, которая разделяет память с исходными данными.

Синтаксис

gounsafe.String(ptr *byte, len int) string

Пример '1' - преобразование массива байтов в строку

Давайте создадим строку из массива байтов:

gopackage 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)
}

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

go"abcde"

Пример '2' - создание строки из части данных

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

gopackage main

import (
  "fmt"
  "unsafe"
)

func main() {
  data := []byte{97, 98, 99, 100, 101}
  ptr := &data[0]
  res := unsafe.String(ptr, 3)
  fmt.Println(res)
}

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

go"abc"

Пример '3' - использование с нулевым указателем

Функция позволяет создать пустую строку при длине 0:

gopackage main

import (
  "fmt"
  "unsafe"
)

func main() {
  var ptr *byte
  res := unsafe.String(ptr, 0)
  fmt.Println(res == "")
}

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

go"true"

Пример '4' - изменение исходных данных

Поскольку строка разделяет память с исходными данными, изменение данных повлияет на строку:

gopackage 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)
}

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

go"abc"
"zbc"

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

  • функцию unsafe.StringData,
    которая возвращает указатель на данные строки
  • функцию unsafe.Slice,
    которая создает слайс из указателя и длины
  • функцию unsafe.SliceData,
    которая возвращает указатель на данные слайса
  • функцию unsafe.Sizeof,
    которая возвращает размер значения в байтах