go / expert
Snippet
Zero-Allokation von Slice-Headern aus Zeigern auf Arrays fester Größe
Indem ein Slice-Bereichsausdruck [:] direkt auf einem Zeiger auf ein Array fester Größe angewendet wird, erzeugt Go einen Slice-Header, der direkt auf den zusammenhängenden Speicherblock des Arrays verweist, ohne Daten zu kopieren oder Heap-Allokationen auszulösen.
snippet.go
go
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
package mainimport ("fmt""unsafe")func arrayToSliceHeader(arrPtr *[4]uint64) []uint64 {return (*[4]uint64)(unsafe.Pointer(arrPtr))[:]}func main() {arr := [4]uint64{0xDEAD, 0xBEEF, 0xCAFE, 0xBABE}slice := arrayToSliceHeader(&arr)fmt.Printf("Len: %d, Cap: %d, Val: %X\n", len(slice), cap(slice), slice[1])}
Erklärung
1
func arrayToSliceHeader(arrPtr *[4]uint64) []uint64 {
Definiert eine Funktion, die einen Zeiger auf ein festes 4-Element-uint64-Array akzeptiert und ein uint64-Slice zurückgibt.
2
return (*[4]uint64)(unsafe.Pointer(arrPtr))[:]
Konvertiert den Rohzeiger in einen Array-Zeiger und wendet vollständiges Slicing [:] an, um einen Slice-Header auf den ursprünglichen Speicher abzuleiten.
3
slice := arrayToSliceHeader(&arr)
Übergibt die Speicheradresse des Arrays fester Größe, um das Zero-Copy-Slice abzuleiten.