From d20668fe715af333b88e0c17db7d71e04626f25a Mon Sep 17 00:00:00 2001 From: Bryan Boreham Date: Fri, 5 Jul 2024 15:17:46 +0100 Subject: [PATCH] Neater string vs byte-slice conversions unsafe.Slice and unsafe.StringData were added in Go 1.20 Signed-off-by: Bryan Boreham --- model/labels/labels_common.go | 2 +- model/labels/labels_stringlabels.go | 11 ++++------- model/textparse/promparse.go | 2 +- tsdb/encoding/encoding.go | 4 +--- tsdb/index/index.go | 2 +- 5 files changed, 8 insertions(+), 13 deletions(-) diff --git a/model/labels/labels_common.go b/model/labels/labels_common.go index 4bc94f84f..7fc09b329 100644 --- a/model/labels/labels_common.go +++ b/model/labels/labels_common.go @@ -218,5 +218,5 @@ func contains(s []Label, n string) bool { } func yoloString(b []byte) string { - return *((*string)(unsafe.Pointer(&b))) + return unsafe.String(unsafe.SliceData(b), len(b)) } diff --git a/model/labels/labels_stringlabels.go b/model/labels/labels_stringlabels.go index bccceb61f..ba2be7cdb 100644 --- a/model/labels/labels_stringlabels.go +++ b/model/labels/labels_stringlabels.go @@ -16,7 +16,6 @@ package labels import ( - "reflect" "slices" "strings" "unsafe" @@ -299,10 +298,8 @@ func Equal(ls, o Labels) bool { func EmptyLabels() Labels { return Labels{} } -func yoloBytes(s string) (b []byte) { - *(*string)(unsafe.Pointer(&b)) = s - (*reflect.SliceHeader)(unsafe.Pointer(&b)).Cap = len(s) - return +func yoloBytes(s string) []byte { + return unsafe.Slice(unsafe.StringData(s), len(s)) } // New returns a sorted Labels from the given labels. @@ -338,8 +335,8 @@ func Compare(a, b Labels) int { } i := 0 // First, go 8 bytes at a time. Data strings are expected to be 8-byte aligned. - sp := unsafe.Pointer((*reflect.StringHeader)(unsafe.Pointer(&shorter)).Data) - lp := unsafe.Pointer((*reflect.StringHeader)(unsafe.Pointer(&longer)).Data) + sp := unsafe.Pointer(unsafe.StringData(shorter)) + lp := unsafe.Pointer(unsafe.StringData(longer)) for ; i < len(shorter)-8; i += 8 { if *(*uint64)(unsafe.Add(sp, i)) != *(*uint64)(unsafe.Add(lp, i)) { break diff --git a/model/textparse/promparse.go b/model/textparse/promparse.go index a611f3aea..575976927 100644 --- a/model/textparse/promparse.go +++ b/model/textparse/promparse.go @@ -502,7 +502,7 @@ func unreplace(s string) string { } func yoloString(b []byte) string { - return *((*string)(unsafe.Pointer(&b))) + return unsafe.String(unsafe.SliceData(b), len(b)) } func parseFloat(s string) (float64, error) { diff --git a/tsdb/encoding/encoding.go b/tsdb/encoding/encoding.go index cd98fbd82..69ab31cc2 100644 --- a/tsdb/encoding/encoding.go +++ b/tsdb/encoding/encoding.go @@ -20,7 +20,6 @@ import ( "hash" "hash/crc32" "math" - "unsafe" "github.com/dennwc/varint" ) @@ -75,8 +74,7 @@ func (e *Encbuf) PutVarint64(x int64) { // PutUvarintStr writes a string to the buffer prefixed by its varint length (in bytes!). func (e *Encbuf) PutUvarintStr(s string) { - b := *(*[]byte)(unsafe.Pointer(&s)) - e.PutUvarint(len(b)) + e.PutUvarint(len(s)) e.PutString(s) } diff --git a/tsdb/index/index.go b/tsdb/index/index.go index 362105459..dee2b4c4c 100644 --- a/tsdb/index/index.go +++ b/tsdb/index/index.go @@ -2062,5 +2062,5 @@ func (dec *Decoder) Series(b []byte, builder *labels.ScratchBuilder, chks *[]chu } func yoloString(b []byte) string { - return *((*string)(unsafe.Pointer(&b))) + return unsafe.String(unsafe.SliceData(b), len(b)) }