すると、次のコードを実行する場合:ポインタが変数のときにポインタのメソッドが動作するのはなぜですか?
package main
import (
"fmt"
)
type Bar struct {
name string
}
func (foo Bar) testFunc() {
fmt.Println(foo.name)
}
func doTest(pointer *Bar) {
pointer.testFunc() // run `testFunc` on the pointer (even though it expects a value of type `Bar`, not `*Bar`)
}
func main() {
var baz Bar = Bar{
name: "Johnny Appleseed",
}
doTest(&baz) // send a pointer of `baz` to `doTest()`
}
出力読み取り:Johnny Appleseed
。私はポインタ上でtestFunc()
を呼び出す際にエラーが発生したと思っていたでしょう。
その後、私は&baz.testFunc()
のdoTest(&baz)
を切り替えてみました。それから私は、エラーを受け取った:baz.testFunc()
を呼び出す代わりに、直接の別の機能を通じてとき
tmp/sandbox667065035/main.go:24: baz.testFunc() used as value
なぜ私はエラーが出るのですか? doTest(&baz)
と&baz.testFunc()
は全く同じことをしません。doTest(pointer *Bar)
は単にpointer.testFunc()
を呼び出しますか?
Playground 2 (&baz.testFunc()
)
Goは(ドット)の呼び出しでデリファレンス自動ポインタを持っているように動作
。 – saarrrr