go / expert
Snippet
Zero-Copy-Konvertierung von Byte-Slices in Strings mittels unsafe.SliceData und unsafe.String
Standard-String-Konvertierungen führen Heap-Reallokationen durch, um zugrundeliegende Byte-Arrays zu kopieren. Durch Nutzung der Go 1.20+-Primitiven unsafe.SliceData, unsafe.String und unsafe.StringData können Zero-Copy-Konvertierungen sicher erstellt werden, ohne auf rohe Speicher-Header zuzugreifen.
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
28
package mainimport ("fmt""unsafe")func FastBytesToString(b []byte) string {if len(b) == 0 {return ""}return unsafe.String(unsafe.SliceData(b), len(b))}func FastStringToBytes(s string) []byte {if len(s) == 0 {return nil}return unsafe.Slice(unsafe.StringData(s), len(s))}func main() {buf := []byte("Zero Allocation High Performance String")str := FastBytesToString(buf)back := FastStringToBytes(str)fmt.Printf("String: %s, Bytes len: %d\n", str, len(back))}
Erklärung
1
unsafe.String(unsafe.SliceData(b), len(b))
Erhält den zugrundeliegenden Zeiger eines Byte-Slices und wandelt ihn direkt in eine unveränderliche String-Referenz um.
2
unsafe.Slice(unsafe.StringData(s), len(s))
Wandelt einen String-Zeiger in eine Byte-Slice-Ansicht um, die denselben Speicherblock teilt.