Функция unsafe.SliceData
Функция unsafe.SliceData возвращает указатель на первый элемент
базового массива, лежащего в основе слайса. В первый параметр
функция принимает слайс любого типа, а возвращает значение типа
unsafe.Pointer. Эта функция полезна при работе с низкоуровневыми
операциями над памятью, где требуется прямой доступ к данным слайса
без копирования.
Синтаксис
unsafe.SliceData(slice)
Пример
Давайте получим указатель на базовый массив слайса []int{1, 2, 3, 4, 5}
и преобразуем его в указатель на первый элемент:
package main
import (
"fmt"
"unsafe"
)
func main() {
slice := []int{1, 2, 3, 4, 5}
ptr := unsafe.SliceData(slice)
intPtr := (*int)(ptr)
fmt.Println(*intPtr)
}
Результат выполнения кода:
1
Пример
Давайте изменим значение первого элемента слайса через указатель,
полученный с помощью unsafe.SliceData:
package 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)
}
Результат выполнения кода:
[z b c d e]
Пример
Давайте получим доступ ко второму элементу слайса, используя арифметику
указателей и unsafe.SliceData:
package 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)
}
Результат выполнения кода:
2
Смотрите также
-
функцию
unsafe.Pointer,
которая представляет собой универсальный указатель для работы с памятью -
функцию
unsafe.Slice,
которая создает слайс из указателя на базовый массив -
функцию
unsafe.Sizeof,
которая возвращает размер значения в байтах -
функцию
unsafe.StringData,
которая возвращает указатель на базовый массив строки