Результат тот же.
Одна вещь, которую вы не проверяли, - это емкость, другое свойство срезов.Итак, давайте проверим это тоже:
s := make([]int, 2, 4)
s2 := s
s3 := s[:]
fmt.Println(len(s), cap(s))
fmt.Println(len(s2), cap(s2))
fmt.Println(len(s3), cap(s3))
Вывод (попробуйте на Go Playground ):
2 4
2 4
2 4
В основном выражение среза s[:]
означает нарезку среза и использование 0 в качестве нижнего индекса, len(s)
в качестве верхнего и cap(s)
в качестве емкости.Таким образом, результатом будет срез, идентичный s
.
. Для удобства чтения просто скопируйте заголовок среза: s2 := s
.
Также обратите внимание, что если s
будет nil
и копирование, и нарезка его также приведет к получению nil
фрагментов:
var s []int
s2 := s
s3 := s[:]
fmt.Println(len(s), cap(s), s == nil)
fmt.Println(len(s2), cap(s2), s2 == nil)
fmt.Println(len(s3), cap(s3), s3 == nil)
Вывод вышеизложенного (попробуйте на Go Playground ):
0 0 true
0 0 true
0 0 true
Так что нет абсолютно никакой разницы в результате.Реализация компилятора может или не может имитировать оператор s2 := s
, когда вы пишете s2 := s[:]
, поэтому последний может быть медленнее.Но опять же, нет причин не просто копировать его.