我只是通過Effective Go並在Pointers vs. Values部分閱讀,臨近年底它說:轉到接收器的方法調用語法混亂
關於指針與對接收者值的規則是值的方法可以在指針和值上調用,但指針方法只能在指針上調用。這是因爲指針方法可以修改接收器;在值的副本上調用它們會導致這些修改被丟棄。
爲了測試它,我寫了這個:
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
可調用。我在這裏做錯了什麼?
所以基本上「Effective Go」在這方面是錯的? – Jibran
我不會說這是錯的。在這個有限的情況下,Go隱式地取了x的地址,所以該方法仍然在一個指針上運行。區別在於,您將vAge vs&vAge傳遞給期望fmt.Stringer的函數。第一個會失敗,第二個不會。 –