mirror of
https://github.com/golang/go
synced 2024-11-18 13:04:46 -07:00
strings: simplify code using unsafe.StringData
Updates #54854 Change-Id: I93396dc92bd2decba895f2d059e1aeffcd22312c Reviewed-on: https://go-review.googlesource.com/c/go/+/428158 Run-TryBot: Bryan Mills <bcmills@google.com> TryBot-Result: Gopher Robot <gobot@golang.org> Auto-Submit: Bryan Mills <bcmills@google.com> Reviewed-by: Bryan Mills <bcmills@google.com> Reviewed-by: Robert Griesemer <gri@google.com>
This commit is contained in:
parent
92b8f4e293
commit
2ee075dc47
@ -45,7 +45,7 @@ func (b *Builder) copyCheck() {
|
||||
|
||||
// String returns the accumulated string.
|
||||
func (b *Builder) String() string {
|
||||
return *(*string)(unsafe.Pointer(&b.buf))
|
||||
return unsafe.String(unsafe.SliceData(b.buf), len(b.buf))
|
||||
}
|
||||
|
||||
// Len returns the number of accumulated bytes; b.Len() == len(b.String()).
|
||||
|
@ -24,5 +24,5 @@ func Clone(s string) string {
|
||||
}
|
||||
b := make([]byte, len(s))
|
||||
copy(b, s)
|
||||
return *(*string)(unsafe.Pointer(&b))
|
||||
return unsafe.String(&b[0], len(b))
|
||||
}
|
||||
|
@ -5,7 +5,6 @@
|
||||
package strings_test
|
||||
|
||||
import (
|
||||
"reflect"
|
||||
"strings"
|
||||
"testing"
|
||||
"unsafe"
|
||||
@ -27,15 +26,12 @@ func TestClone(t *testing.T) {
|
||||
t.Errorf("Clone(%q) = %q; want %q", input, clone, input)
|
||||
}
|
||||
|
||||
inputHeader := (*reflect.StringHeader)(unsafe.Pointer(&input))
|
||||
cloneHeader := (*reflect.StringHeader)(unsafe.Pointer(&clone))
|
||||
if len(input) != 0 && cloneHeader.Data == inputHeader.Data {
|
||||
if len(input) != 0 && unsafe.StringData(clone) == unsafe.StringData(input) {
|
||||
t.Errorf("Clone(%q) return value should not reference inputs backing memory.", input)
|
||||
}
|
||||
|
||||
emptyHeader := (*reflect.StringHeader)(unsafe.Pointer(&emptyString))
|
||||
if len(input) == 0 && cloneHeader.Data != emptyHeader.Data {
|
||||
t.Errorf("Clone(%#v) return value should be equal to empty string.", inputHeader)
|
||||
if len(input) == 0 && unsafe.StringData(clone) != unsafe.StringData(emptyString) {
|
||||
t.Errorf("Clone(%#v) return value should be equal to empty string.", unsafe.StringData(input))
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -57,7 +57,7 @@ func TestCompareStrings(t *testing.T) {
|
||||
// unsafeString converts a []byte to a string with no allocation.
|
||||
// The caller must not modify b while the result string is in use.
|
||||
unsafeString := func(b []byte) string {
|
||||
return *(*string)(unsafe.Pointer(&b))
|
||||
return unsafe.String(unsafe.SliceData(b), len(b))
|
||||
}
|
||||
|
||||
lengths := make([]int, 0) // lengths to test in ascending order
|
||||
|
@ -660,8 +660,7 @@ func TestMap(t *testing.T) {
|
||||
}
|
||||
orig := "Input string that we expect not to be copied."
|
||||
m = Map(identity, orig)
|
||||
if (*reflect.StringHeader)(unsafe.Pointer(&orig)).Data !=
|
||||
(*reflect.StringHeader)(unsafe.Pointer(&m)).Data {
|
||||
if unsafe.StringData(orig) != unsafe.StringData(m) {
|
||||
t.Error("unexpected copy during identity map")
|
||||
}
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user