У меня есть вопрос об интерфейсе чтения, определение выглядит следующим образом:Значение изменения Считывателя интерфейса
type Reader interface {
Read(p []byte) (n int, err error)
}
Я следующий код, который использует интерфейс для чтения:
package main
import (
"fmt"
"os"
)
// Reading files requires checking most calls for errors.
// This helper will streamline our error checks below.
func check(e error) {
if e != nil {
panic(e)
}
}
func main() {
// You'll often want more control over how and what
// parts of a file are read. For these tasks, start
// by `Open`ing a file to obtain an `os.File` value.
f, err := os.Open("configuration.ini")
check(err)
// Read some bytes from the beginning of the file.
// Allow up to 5 to be read but also note how many
// actually were read.
b1 := make([]byte, 10)
n1, err := f.Read(b1)
check(err)
fmt.Printf("%d bytes: %s\n", n1, string(b1))
f.Close()
}
Как вы можете видеть приведенный выше код b1
определяется как байтовый бит и он передается методу Read
в качестве аргумента значения. После метода Read
, b1
содержит первые 10 букв из файла.
Что для меня очень смущает код выше, почему b1
содержит внезапные значения после метода Read
.
В Golang, когда я передаю значение методу, он будет передан как значение, а не как ссылка. Чтобы уточнить, что я говорю, я сделал пример приложения:
package main
import (
"fmt"
)
func passAsValue(p []byte) {
c := []byte("Foo")
p = c
}
func main() {
b := make([]byte, 10)
passAsValue(b)
fmt.Println(string(b))
}
После passAsValue
функции b
не содержит никаких значений и то, что я ожидал в golang, аргументы будут проходить в качестве значения функции или метода ,
Почему тогда первый фрагмент кода может изменять содержимое переданного аргумента? Если метод Read
ожидает указатель на []byte
, то я согласен, но в этом случае нет.
Кусочек не является ссылочным типом. Это тип значения, который содержит ссылку на базовый массив. –
@ Анонимно _reference_ Я не имею в виду то же, что _pointer_. Но отредактирован, чтобы сделать его однозначным. Благодарю. – icza
@ Тип анонимного _Reference_ - это не то же самое, что тип _Pointer_. Пожалуйста, проверьте статью в блоге [Go maps in action] (http://blog.golang.org/go-maps-in-action): _ «Типы карт являются ** ссылочными ** типами, такими как указатели или ** фрагменты ** "_ – icza