Функция unsafe.Slice
Функция unsafe.Slice создает слайс, используя указатель на первый элемент массива и длину. Первым параметром функция принимает указатель на произвольный тип, вторым - длину создаваемого слайса. Возвращаемое значение представляет собой слайс типа []T, где T - тип элемента, на который указывает переданный указатель. Эта функция позволяет преобразовать непрерывный блок памяти в слайс, что особенно полезно при работе с сырыми данными.
Синтаксис
unsafe.Slice(ptr, length)
Пример
Давайте создадим слайс из указателя на первый элемент массива:
package 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)
}
Результат выполнения кода:
[1 2 3 4 5]
Пример
Давайте создадим слайс строк из непрерывного блока памяти:
package 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)
}
Результат выполнения кода:
[a b c]
Пример
Давайте создадим слайс байт из указателя на данные:
package 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))
}
Результат выполнения кода:
"Hello Go"
Пример
Давайте создадим слайс с использованием функции unsafe.Add для изменения смещения:
package 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)
}
Результат выполнения кода:
[4 5 6 7]
Смотрите также
-
функцию
unsafe.Pointer,
которая представляет указатель на произвольный тип данных -
функцию
unsafe.Sizeof,
которая возвращает размер типа в байтах -
функцию
unsafe.Add,
которая выполняет арифметику указателей -
функцию
unsafe.SliceData,
которая возвращает указатель на первый элемент слайса