Функция unsafe.SliceData

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

Синтаксис

gounsafe.SliceData(slice)

Пример

Давайте получим указатель на базовый массив слайса []int{1, 2, 3, 4, 5} и преобразуем его в указатель на первый элемент:

gopackage main

import (
  "fmt"
  "unsafe"
)

func main() {
  slice := []int{1, 2, 3, 4, 5}
  ptr := unsafe.SliceData(slice)
  intPtr := (*int)(ptr)

  fmt.Println(*intPtr)
}

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

go1

Пример

Давайте изменим значение первого элемента слайса через указатель, полученный с помощью unsafe.SliceData:

gopackage main

import (
  "fmt"
  "unsafe"
)

func main() {
  slice := []string{"a", "b", "c", "d", "e"}
  ptr := unsafe.SliceData(slice)
  strPtr := (*string)(ptr)

  *strPtr = "z"
  fmt.Println(slice)
}

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

go[z b c d e]

Пример

Давайте получим доступ ко второму элементу слайса, используя арифметику указателей и unsafe.SliceData:

gopackage main

import (
  "fmt"
  "unsafe"
)

func main() {
  slice := []int{1, 2, 3, 4, 5}
  ptr := unsafe.SliceData(slice)
  secondPtr := unsafe.Add(ptr, 8)
  intPtr := (*int)(secondPtr)

  fmt.Println(*intPtr)
}

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

go2

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

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