Функция unsafe.Slice

Функция unsafe.Slice создает слайс, используя указатель на первый элемент массива и длину. Первым параметром функция принимает указатель на произвольный тип, вторым - длину создаваемого слайса. Возвращаемое значение представляет собой слайс типа []T, где T - тип элемента, на который указывает переданный указатель. Эта функция позволяет преобразовать непрерывный блок памяти в слайс, что особенно полезно при работе с сырыми данными.

Синтаксис

gounsafe.Slice(ptr, length)

Пример

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

gopackage main

import (
  "fmt"
  "unsafe"
)

func main() {
  arr := [5]int{1, 2, 3, 4, 5}
  ptr := unsafe.Pointer(&arr[0])
  res := unsafe.Slice((*int)(ptr), 5)
  fmt.Println(res)
}

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

go[1 2 3 4 5]

Пример

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

gopackage main

import (
  "fmt"
  "unsafe"
)

func main() {
  arr := []string{"a", "b", "c", "d", "e"}
  ptr := unsafe.Pointer(&arr[0])
  res := unsafe.Slice((*string)(ptr), 3)
  fmt.Println(res)
}

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

go[a b c]

Пример

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

gopackage main

import (
  "fmt"
  "unsafe"
)

func main() {
  data := [8]byte{'H', 'e', 'l', 'l', 'o', ' ', 'G', 'o'}
  ptr := unsafe.Pointer(&data[0])
  res := unsafe.Slice((*byte)(ptr), 8)
  fmt.Println(string(res))
}

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

go"Hello Go"

Пример

Давайте создадим слайс с использованием функции unsafe.Add для изменения смещения:

gopackage main

import (
  "fmt"
  "unsafe"
)

func main() {
  arr := [10]int{1, 2, 3, 4, 5, 6, 7, 8, 9, 10}
  ptr := unsafe.Add(unsafe.Pointer(&arr[0]), 3*unsafe.Sizeof(arr[0]))
  res := unsafe.Slice((*int)(ptr), 4)
  fmt.Println(res)
}

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

go[4 5 6 7]

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

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