Если bs не является единственным аргументом, то как Read () может его изменить?
Возможно, вам не хватает базовых знаний о языках программирования в целом.Существуют разные виды «ценностей».Есть указатели (или ссылки) и есть «обычные значения».
Например:
package main
import (
"fmt"
)
func changeIt(p *int) {
*p = 9
}
func main() {
a := 1
fmt.Println(a)
changeIt(&a)
fmt.Println(a)
}
Будет напечатано 1 9
, а не 1 1
.*int
не целое число, а указатель на целое число.Указатель - это значение, которое указывает (ссылается) на другое значение.Если у вас есть значение указателя типа, вы получите фактическое значение, на которое указывает указатель, используя *
(который называется разыменованием):
func main() {
a := 1
b := &a
fmt.Println(b, *b)
}
b
- указатель (типа *int
) это указывает на a
.println
напечатает местоположение a
, за которым следует значение a
, которое обычно что-то вроде uhm 0x10414020 1
.Мы также можем изменить значение, на которое указывает указатель, используя *p = ...
:
func main() {
a := 1
b := &a
*b = 9
fmt.Println(b, *b, a)
}
, который будет печатать 0x10414020 9 9
.
Теперь, []byte
- это слайс ... слайсыкак указатели.Когда вы делаете
func changeIt(buf []byte) {
buf[0] = 10
}
func main() {
data := []byte{1,2,3}
changeIt(data)
fmt.Println(data)
}
На самом деле вы не передаете значения [1 2 3]
в changeIt
, а указывает на эти значения.Таким образом, здесь println
покажет [10 2 3]
.Сравните это с:
func changeIt(buf [3]byte) {
buf[0] = 10
}
func main() {
data := [3]byte{1,2,3}
changeIt(data)
fmt.Println(data)
}
, который напечатает [1 2 3]
и передаст значения [1 2 3]
, а не указатель, поэтому changeIt по существу работает с копией, а buf[0] = 10
не имеет никакого эффекта.Помните: [n]T
- это массив, []T
- это фрагмент.[n]T
является «необработанным значением», а []T
является «значением указателя».