make
and copy
cloned := make(SliceType, len(aSlice))
copy(cloned, aSlice)
make
call.
aSlice
is nil, the cloned slice is not nil. Sometimes, this matters.
SliceType
if SliceType
is declared in another package.
var cloned SliceType
if aSlice != nil {
cloned = make(SliceType, len(aSlice))
copy(cloned, aSlice)
}
make
and append
append(make(SliceType, 0, len(aSlice)), aSlice...)
make
call will unnecessarily zeros the elements of the cloned slice,
aSlice
is nil, the cloned slice is not nil. Sometimes, this matters.
SliceType
if SliceType
is declared in another package.
append
append(SliceType(nil), aSlice...) // manner 1
// or
append(SliceType{}, aSlice...) // manner 2
aSlice
is a non-nil blank slice, the cloned slice is nil.
aSlice
is a nil slice, the cloned slice is not nil.
SliceType
if SliceType
is declared in another package.
append
cleverly append(aSlice[:0:0], aSlice...)
aSlice
is a non-nil blank slice, the cloned slice is also a non-nil blank slice.
aSlice
is a nil slice, the cloned slice is also nil.
SliceType
.
aSlice
is a non-nil blank slice, then the cloned slice (also a non-nil blank slice) references the same underlying element memory block as the source slice. This might prevent (or delay) the collection of the element memory block when the source slice become unused.
slices.Clone
(since Go 1.21)import "slices"
slices.Clone(aSlice)
slices.Clone
simply uses the way 5 approach. So it offers similar benefits and drawbacks to way 5. And it has one more drawback: it needs to import the "slices" stdandard package.
The Go 101 project is hosted on Github. Welcome to improve Go 101 articles by submitting corrections for all kinds of mistakes, such as typos, grammar errors, wording inaccuracies, description flaws, code bugs and broken links.
If you would like to learn some Go details and facts every serveral days, please follow Go 101's official Twitter account @zigo_101.