Некоторые мысли ... надеюсь, это поможет:
h [: 0] -> создать пустой фрагмент из h
... но он все еще ссылается на тот же базовый массив.
Затем срез передается методу hw.Sum(h[:0])
Обратите внимание, что при передаче среза в метод целевой метод может изменить значение среза (поскольку срез является ссылочным типом, найдите relect.SliceHeader, чтобы узнать, почему)
Если вы посмотрите на метод Sum.Это на самом деле изменить значение среза h
на строчку кода ниже:
return append(in, hash...)
Итак, оператор возврата выполняет 2 задания:
- Изменение содержимого среза
in
(h
в нашем случае) - Вернуть срез
h
Они используют именованный возврат h
, поэтому для меня это немного усложняет коднемного трудно читать.
Кстати, приведенный ниже код проясняет, как работает срез (извините, если нет):
package main
import (
"fmt"
)
func Sum(in []byte) []byte {
return append(in, []byte{'a','b'}...)
}
func main() {
h := [4]byte{}
Sum(h[:0])
fmt.Printf("%s\n", h) //should print 'ab'
}