我只是在阅读“有效执行”并在“指针与值”部分中接近结尾处说:
关于接收方的指针与值的规则是,可以在指针和值上调用值方法,但是只能在指针上调用指针方法。这是因为指针方法可以修改接收者。在值的副本上调用它们将导致那些修改被丢弃。
为了测试它,我这样写:
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。我在这里做错什么了吗?
白衣染霜花
扬帆大鱼
相关分类