diff --git a/internal/conv/string.go b/internal/conv/string.go index 9a518c578..ab2b7f44b 100644 --- a/internal/conv/string.go +++ b/internal/conv/string.go @@ -8,8 +8,12 @@ import ( // UnsafeStrToBytes uses unsafe to convert string into byte array. Returned bytes // must not be altered after this function is called as it will cause a segmentation fault. func UnsafeStrToBytes(s string) []byte { - var buf = *(*[]byte)(unsafe.Pointer(&s)) - (*reflect.SliceHeader)(unsafe.Pointer(&buf)).Cap = len(s) + var buf []byte + sHdr := (*reflect.StringHeader)(unsafe.Pointer(&s)) + bufHdr := (*reflect.SliceHeader)(unsafe.Pointer(&buf)) + bufHdr.Data = sHdr.Data + bufHdr.Cap = sHdr.Len + bufHdr.Len = sHdr.Len return buf } @@ -18,6 +22,5 @@ func UnsafeStrToBytes(s string) []byte { // to be used generally, but for a specific pattern to delete keys // from a map. func UnsafeBytesToStr(b []byte) string { - hdr := (*reflect.StringHeader)(unsafe.Pointer(&b)) - return *(*string)(unsafe.Pointer(hdr)) + return *(*string)(unsafe.Pointer(&b)) } diff --git a/internal/conv/string_test.go b/internal/conv/string_test.go index 2a1892b43..3a1451753 100644 --- a/internal/conv/string_test.go +++ b/internal/conv/string_test.go @@ -2,6 +2,7 @@ package conv import ( "runtime" + "strconv" "testing" "time" @@ -45,3 +46,9 @@ func (s *StringSuite) TestUnsafeBytesToStr() { s.Equal("abc", str) } } + +func BenchmarkUnsafeStrToBytes(b *testing.B) { + for i := 0; i < b.N; i++ { + UnsafeStrToBytes(strconv.Itoa(i)) + } +}