Golang方法

作者: TZX_0710 | 来源:发表于2021-08-04 17:30 被阅读0次

    方法

    • 只能未当前包含命令类型定义方法
    • 参数receiver可任意命名。如方法中未曾使用,可省略参数名
    • 参数receiver类型可以是T或者是*T。基类型T不能是接口或指针
    • 不支持方法重载,receiver知识参数签名的组成部分
    • 可用实例value或pointer调用全部方法,编译器自动转换

    一个方法就是一个包含了接收者的函数,接收者可以是命名类型或者结构体类型的一个值或者是一个指针

    所有给定类型的方法属于该类型的方法集

    //当接收者不是一个指针的时候,该方法操作对应接收者的值的副本(意思就是即使使用了指针调用函数,但是函数的接收者是值类型)所以函数内部操作还是对副本的操作,而不是指针操作
    package main
    
    import "fmt"
    
    type User struct {
      Name  string
      Email string
    }
    
    func (u User) Notify() {
      fmt.Printf("%v: %v \n", u.Name, u.Email)
    }
    func main() {
      //值类型方法调用
      user := User{Name: "Golang", Email: "Goland.com"}
      user.Notify()
    
      //指针类型调用方法
      u := &User{Name: "Golang", Email: "Goland"}
      u.Notify()
    }
    
    //当接收者是一个指针的时候,即使用值类型调用那么函数内部也是对指针的操作。
    
    func (u *User) Notify() {
      fmt.Printf("%v: %v \n", u.Name, u.Email)
    }
    func main() {
      //值类型方法调用
      user := User{Name: "Golang", Email: "Goland.com"}
      user.Notify()
    
      //指针类型调用方法
      u := &User{Name: "Golang", Email: "Goland"}
      u.Notify()
    }
    
    

    receiver T 和 *T 的差别

    package main
    
    import "fmt"
    
    type User struct {
      Name  string
      Email string
    }
    
    func (u User) Notify_1() {
      fmt.Printf("Value: %p\n", &u)
    }
    
    func (u *User) Notify_2() {
      fmt.Printf("Pointer: %p\n", u)
    }
    
    func main() {
      user := User{Name: "张三", Email: "Goland.com"}
      //0xc0000503c0
      var u = &user
    
      fmt.Printf("u: %p\n", u)
      //0xc000050400  传入的receiver 接收者实参 发生了值拷贝
      user.Notify_1()
      //0xc0000503c0 传入的receiver 接收者实参 还是使用的指针值
      user.Notify_2()
      //0xc000050420  传入的receiver 接收者实参 发生了值拷贝
      u.Notify_1()
      // 传入的receiver 接收者实参 还是使用的指针值
      u.Notify_2()
    }
    
    

    普通函数与方法的区别

    1. 对于普通函数接收者是值类型时,不能直接将指针类型的数据直接传递 反过来也一样
    2. 对于方法如struct方法,接收者为值类型时,可以直接用指针类型的变量调用方法,反过来同样可以

    相关文章

      网友评论

        本文标题:Golang方法

        本文链接:https://www.haomeiwen.com/subject/juwuvltx.html