Home > Backend Development > Golang > How to Efficiently Create a Go Array or Slice from an unsafe.Pointer?

How to Efficiently Create a Go Array or Slice from an unsafe.Pointer?

Barbara Streisand
Release: 2024-12-11 02:25:16
Original
698 people have browsed it

How to Efficiently Create a Go Array or Slice from an unsafe.Pointer?

How to efficiently initialize an array or slice from an array unsafe.Pointer in Go

In the world of Go, you may encounter scenarios where you need to work with data structures represented as unsafe.Pointer. For instance, you might have a pointer to an array like:

p := uintptr(unsafe.Pointer(&array))
size := 5
Copy after login

However, directly accessing array is not feasible, as the pointer is merely a representation of its address. This leaves you with the challenge of creating an array or slice using the known pointer, size, and data type without resorting to memory copies.

Unsafe Approach to Array/Slice Creation

Initially, you may consider the following approach:

data := make([]byte, size)
stepSize := unsafe.Sizeof(data[0])
for i := 0; i < size; i++ {
    data[i] = *(*byte)(unsafe.Pointer(p))
    p += stepSize
}
Copy after login

This solution copies data from the original array to the new slice, which can be inefficient, especially for large data sets.

Efficient Approach using reflect.SliceHeader

A more efficient alternative is to harness the power of Go's reflection package and the reflect.SliceHeader type. By directly manipulating the fields of reflect.SliceHeader, you can create an array or slice that references the same underlying data as your pointer.

Step 1: Obtain reflect.SliceHeader descriptor

Declare a slice variable and cast its []byte type to *reflect.SliceHeader using unsafe conversions:

var data []byte
sh := (*reflect.SliceHeader)(unsafe.Pointer(&data))
Copy after login

Step 2: Modify SliceHeader fields

Assign the pointer, size, and optionally, the capacity to the fields of reflect.SliceHeader:

sh.Data = p
sh.Len = size
sh.Cap = size
Copy after login

Step 3: Convert back to the original data type

Finally, cast the modified reflect.SliceHeader back to your desired data type using unsafe conversions:

data = *(*[]byte)(unsafe.Pointer(sh))
Copy after login

This efficient approach allows you to create an array or slice that shares the same underlying data as your pointer without incurring the cost of unnecessary memory copies.

The above is the detailed content of How to Efficiently Create a Go Array or Slice from an unsafe.Pointer?. For more information, please follow other related articles on the PHP Chinese website!

source:php.cn
Statement of this Website
The content of this article is voluntarily contributed by netizens, and the copyright belongs to the original author. This site does not assume corresponding legal responsibility. If you find any content suspected of plagiarism or infringement, please contact admin@php.cn
Latest Articles by Author
Popular Tutorials
More>
Latest Downloads
More>
Web Effects
Website Source Code
Website Materials
Front End Template