• [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)
  • 相关阅读:
    使用jQuery和CSS自定义HTML5 Video 控件 简单适用
    在win7系统下使用Windows XP Mode 和 Windows Virtual PC搭建window xp系统
    Runtime 解读
    Reachability实时监控网络变化
    关于AsyncSocket
    关于CoreData的用法
    邓白氏编码申请
    Android 到底是个什么东西?
    听 Fabien Potencier 谈Symfony2 之 《What is Symfony2 ?》
    听 Fabien Potencier 谈Symfony2 之 《What is Dependency Injection ?》
  • 原文地址:https://www.cnblogs.com/baylorqu/p/9637547.html
Copyright © 2020-2023  润新知