go学习笔记方法表达式

表达式

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}
}
坚持原创技术分享,您的支持将鼓励我继续创作!