zoukankan      html  css  js  c++  java
  • [GO]方法值和方法表达式

    package main
    
    import "fmt"
    
    type Person struct {
        name string
        sex byte
        age int
    }
    
    func (p Person) SetInfoValue ()  {
        fmt.Printf("SetInfoValue: %p, %v
    ", &p, p)
    }
    
    func (p *Person) SetInfoValuePointer ()  {
        fmt.Printf("SetInfoValuePointer: %p, %v
    ", p, p)
    }
    
    func main() {
        p := Person{"mike", 'm', 18}
        fmt.Printf("main: %p, %v
    ", &p, p)
        p.SetInfoValuePointer()//传统调用方式
        pFunc := p.SetInfoValuePointer //这个就是方法值,调用函数时,无需再传递接收者,隐藏了接收者
        pFunc() //等价于p.SetInfoPointer()
        
        vFunc := p.SetInfoValue  //这里完成内容拷贝的操作
        vFunc()
    }

    执行的结果为

    main: 0xc000044400, {mike 109 18}
    SetInfoValuePointer: 0xc000044400, &{mike 109 18}
    SetInfoValuePointer: 0xc000044400, &{mike 109 18}
    SetInfoValue: 0xc0000444a0, {mike 109 18}

     方法表达式

    package main
    
    import "fmt"
    
    type Person struct {
        name string
        sex byte
        age int
    }
    
    func (p Person) SetInfoValue ()  {
        fmt.Printf("SetInfoValue: %p, %v
    ", &p, p)
    }
    
    func (p *Person) SetInfoValuePointer ()  {
        fmt.Printf("SetInfoValuePointer: %p, %v
    ", p, p)
    }
    
    func main() {
        p := Person{"mike", 'm', 18}
      //方法值,f := p.setinfovaluepointer隐藏了接收者
      //方法表达式
    f :
    = (*Person).SetInfoValuePointer f(&p) //显示的把接收者传递过去 f2 := (Person).SetInfoValue f2(p) //显示的把接收者传递过去
    }

    执行结果

    SetInfoValuePointer: 0xc000044400, &{mike 109 18}
    SetInfoValue: 0xc000044460, {mike 109 18}

     本人表达方式不好就不总结 了,看了下面的区别相信每个人都有自己的理解 

    p := Person("mike", 'm', 18)
    pFunc := p.SetInfoValuePointer        方法值 
    pFunc ()
    ------------------------------------------
    f2 := (*Person).SetInfoValuePointer
    p := Person{"mike", 'm', 18}         方法表达式
    f2(&p)
  • 相关阅读:
    第三周psp
    作业2
    词频统计 SPEC 20170914 1 1 1 1 1
    psp1111
    第一周大作业1
    mongodb安装操作 (2018/11/12)
    中间件 express生成项目(2018/11/10)
    express环境搭建(2018/11/09)
    后端路由(2018/11/07)
    Node模块的基本使用(2018/11/06)
  • 原文地址:https://www.cnblogs.com/baylorqu/p/9637547.html
Copyright © 2011-2022 走看看