表达式
instance.method(args…) => method value
.func(instance, args) => method expression
package main
import "fmt"
type User struct {
id int
name string
}
func (self *User) Test() {
fmt.Printf("%p, %v\n", self, self)
}
func main() {
u := User{1, "Tom"}
u.Test() //0xc42000e1e0, &{1 Tom}
mValue := u.Test
mValue() //0xc42000e1e0, &{1 Tom} 隐式传递receiver
mExpression := (*User).Test
mExpression(&u) //0xc42000e1e0, &{1 Tom} 显示传递receiver
}
method value会复制receiver
package main
import "fmt"
type User struct {
id int
name string
}
func (self User) Test() {
fmt.Println(self)
}
func main() {
u := User{1, "Tom"}
mValue := u.Test
u.id, u.name = 2, "Jack"
u.Test() //{2 Jack}
mValue() //{1 Tom}
}
注意receiver类型差异
package main
import "fmt"
type User struct {
id int
name string
}
func (self *User) TestPointer() {
fmt.Printf("TestPointer:%p, %v\n", self, self)
}
func (self User) TestValue() {
fmt.Printf("TestValue:%p, %v\n", &self, self)
}
func main() {
u := User{1, "Tom"}
m := User.TestValue
m(u) //TestValue:0xc42000e200, {1 Tom}
a := (*User).TestPointer
a(&u) //TestPointer:0xc42000e1e0, &{1 Tom}
b := (*User).TestValue //*User方法集包含TestValue,前面变为func TestValue(self *User) 事迹依然是receiver value copy
b(&u) //TestValue:0xc42000e280, {1 Tom}
}