私はEffective Goを読んでいて、ポインターと値のセクションで、最後の近くに次のように書かれています:
レシーバーのポインターと値に関するルールは、値メソッドはポインターと値で呼び出すことができますが、ポインター メソッドはポインターでのみ呼び出すことができるということです。これは、ポインター メソッドがレシーバーを変更できるためです。値のコピーでそれらを呼び出すと、それらの変更が破棄されます。
それをテストするために、私はこれを書きました:
package main
import (
"fmt"
"reflect"
)
type age int
func (a age) String() string {
return fmt.Sprintf("%d yeasr(s) old", int(a))
}
func (a *age) Set(newAge int) {
if newAge >= 0 {
*a = age(newAge)
}
}
func main() {
var vAge age = 5
pAge := new(age)
fmt.Printf("TypeOf =>\n\tvAge: %v\n\tpAge: %v\n", reflect.TypeOf(vAge),
reflect.TypeOf(pAge))
fmt.Printf("vAge.String(): %v\n", vAge.String())
fmt.Printf("vAge.Set(10)\n")
vAge.Set(10)
fmt.Printf("vAge.String(): %v\n", vAge.String())
fmt.Printf("pAge.String(): %v\n", pAge.String())
fmt.Printf("pAge.Set(10)\n")
pAge.Set(10)
fmt.Printf("pAge.String(): %v\n", pAge.String())
}
そして、ポインターメソッドSet()
は値 var を介して呼び出し可能であってはならないため、ドキュメントにはそうすべきではないと書かれていますが、コンパイルされますvAge
。ここで何か間違ったことをしていますか?