リーダー インターフェイスについて質問があります。定義は次のようになります。
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後に、ファイルからの最初の 10 文字が含まれます。 Readb1
上記のコードについて私が非常に混乱しているのは、メソッド 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私は同意しますが、この場合はそうではありません。