go / expert
Snippet
Zero-Copy-String zu Slice-Inspektion mittels Unsafe-Pointer-Speicherprimitiven
Modernes Go (1.20+) bietet unsafe.StringData und unsafe.Slice, um Byte-Slice-Header direkt über unveränderlichen String-Speicherbereichen ohne Heap-Allokation zu erstellen. Während Zero-Copy-Konvertierungen Leseoperationen optimieren, führt das Mutieren des Byte-Slices zu undefiniertem Laufzeitverhalten durch Schreiben in schreibgeschützte Speichersegmente.
snippet.go
go
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
package mainimport ("fmt""reflect""unsafe")func readOnlyByteView(s string) []byte {if len(s) == 0 {return nil}return unsafe.Slice(unsafe.StringData(s), len(s))}func inspectSliceHeader(b []byte) (uintptr, int, int) {hdr := (*reflect.SliceHeader)(unsafe.Pointer(&b))return hdr.Data, hdr.Len, hdr.Cap}func main() {str := "Immutable Memory String"view := readOnlyByteView(str)ptr, l, c := inspectSliceHeader(view)fmt.Printf("Address: 0x%x, Length: %d, Capacity: %d\n", ptr, l, c)fmt.Printf("Content: %s\n", string(view))}
Erklärung
1
return unsafe.Slice(unsafe.StringData(s), len(s))
Erstellt eine Slice-Ansicht, die ohne Speicher-Kopie auf die zugrunde liegenden Bytes von String 's' zeigt.
2
hdr := (*reflect.SliceHeader)(unsafe.Pointer(&b))
Konvertiert die Slice-Adresse, um direkt auf strukturelle Header-Metadatenfelder zuzugreifen.