mirror of
https://github.com/golang/go
synced 2024-11-11 20:20:23 -07:00
bytes: add Clone function
The new Clone function returns a copy of b[:len(b)] for the input byte slice b. The result may have additional unused capacity. Clone(nil) returns nil. Fixes #45038 Change-Id: I0469a202d77a7b491f1341c08915d07ddd1f0300 Reviewed-on: https://go-review.googlesource.com/c/go/+/359675 Run-TryBot: Martin Möhrmann <martin@golang.org> TryBot-Result: Gopher Robot <gobot@golang.org> Reviewed-by: Joseph Tsai <joetsai@digital-static.net> Reviewed-by: Martin Möhrmann <moehrmann@google.com> Reviewed-by: Ian Lance Taylor <iant@google.com>
This commit is contained in:
parent
69a8954282
commit
7b45edb450
1
api/next/45038.txt
Normal file
1
api/next/45038.txt
Normal file
@ -0,0 +1 @@
|
||||
pkg bytes, func Clone([]uint8) []uint8 #45038
|
@ -1299,3 +1299,13 @@ func Cut(s, sep []byte) (before, after []byte, found bool) {
|
||||
}
|
||||
return s, nil, false
|
||||
}
|
||||
|
||||
// Clone returns a copy of b[:len(b)].
|
||||
// The result may have additional unused capacity.
|
||||
// Clone(nil) returns nil.
|
||||
func Clone(b []byte) []byte {
|
||||
if b == nil {
|
||||
return nil
|
||||
}
|
||||
return append([]byte{}, b...)
|
||||
}
|
||||
|
@ -15,6 +15,7 @@ import (
|
||||
"testing"
|
||||
"unicode"
|
||||
"unicode/utf8"
|
||||
"unsafe"
|
||||
)
|
||||
|
||||
func eq(a, b []string) bool {
|
||||
@ -2118,3 +2119,35 @@ func BenchmarkIndexPeriodic(b *testing.B) {
|
||||
})
|
||||
}
|
||||
}
|
||||
|
||||
func TestClone(t *testing.T) {
|
||||
var cloneTests = [][]byte{
|
||||
[]byte(nil),
|
||||
[]byte{},
|
||||
Clone([]byte{}),
|
||||
[]byte(strings.Repeat("a", 42))[:0],
|
||||
[]byte(strings.Repeat("a", 42))[:0:0],
|
||||
[]byte("short"),
|
||||
[]byte(strings.Repeat("a", 42)),
|
||||
}
|
||||
for _, input := range cloneTests {
|
||||
clone := Clone(input)
|
||||
if !Equal(clone, input) {
|
||||
t.Errorf("Clone(%q) = %q; want %q", input, clone, input)
|
||||
}
|
||||
|
||||
if input == nil && clone != nil {
|
||||
t.Errorf("Clone(%#v) return value should be equal to nil slice.", input)
|
||||
}
|
||||
|
||||
if input != nil && clone == nil {
|
||||
t.Errorf("Clone(%#v) return value should not be equal to nil slice.", input)
|
||||
}
|
||||
|
||||
inputHeader := (*reflect.SliceHeader)(unsafe.Pointer(&input))
|
||||
cloneHeader := (*reflect.SliceHeader)(unsafe.Pointer(&clone))
|
||||
if cap(input) != 0 && cloneHeader.Data == inputHeader.Data {
|
||||
t.Errorf("Clone(%q) return value should not reference inputs backing memory.", input)
|
||||
}
|
||||
}
|
||||
}
|
||||
|
Loading…
Reference in New Issue
Block a user