package main

import "fmt"

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

执行的结果为

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

方法表达式

package main

import "fmt"

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

执行结果

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

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

p := Person("mike", 'm', )
pFunc := p.SetInfoValuePointer        方法值
pFunc ()
------------------------------------------
f2 := (*Person).SetInfoValuePointer
p := Person{"mike", 'm', 18}         方法表达式
f2(&p)

[GO]方法值和方法表达式的更多相关文章

  1. GO的方法值和方法表达式用法

    手册上关于这块的解释感觉不是很详细清晰,经过几个示例自己总结了下这块的用法. 方法表达式:说简单点,其实就是方法对象赋值给变量. 这里有两种使用方式: 1)方法值:隐式调用, struct实例获取方法 ...

  2. 编写高质量代码改善C#程序的157个建议[为泛型指定初始值、使用委托声明、使用Lambda替代方法和匿名方法]

    前言 泛型并不是C#语言一开始就带有的特性,而是在FCL2.0之后实现的新功能.基于泛型,我们得以将类型参数化,以便更大范围地进行代码复用.同时,它减少了泛型类及泛型方法中的转型,确保了类型安全.委托 ...

  3. .net学习之新语法学习(匿名类和匿名方法,扩展方法,系统内置委托,Lambda表达式和linq等)

    1.自动属性 Auto-Implemented Properties 2.隐式类型 var  var变量不能作为全局变量使用,因为不能在编译时确定类型 3.参数默认值 和 命名参数 4.对象初始化器 ...

  4. Effective Java 第三版——43.方法引用优于lambda表达式

    Tips <Effective Java, Third Edition>一书英文版已经出版,这本书的第二版想必很多人都读过,号称Java四大名著之一,不过第二版2009年出版,到现在已经将 ...

  5. LINQ to Entities 不识别方法“System.String get_Item(Int32)”,因此该方法无法转换为存储表达式。

    1.LINQ to Entities 不识别方法“System.String get_Item(Int32)”,因此该方法无法转换为存储表达式.项目中发现linq to entities 不识别? , ...

  6. scala学习手记38 - 方法命名约定和for表达式

    方法命名约定 之前在学习<运算符重载>一节时曾经说过一个方法命名约定:方法的第一个字符决定了方法的优先级.现在再说另一个命名约定:如果方法以冒号(:)结尾,则调用目标是运算符后面的实例. ...

  7. 委托+内置委托方法+多播委托+lambda表达式+事件

    委托概念:如果我们要把方法当做参数来传递的话,就要用到委托.简单来说委托是一个类型,这个类型可以赋值一个方法的引用. 声明委托: 在C#中使用一个类分两个阶段,首选定义这个类,告诉编译器这个类由什么字 ...

  8. mysql 清空或删除表数据后,控制表自增列值的方法

    http://blog.sina.com.cn/s/blog_68431a3b0100y04v.html 方法1: truncate table 你的表名 //这样不但将数据全部删除,而且重新定位自增 ...

  9. 深入探究JVM之方法调用及Lambda表达式实现原理

    @ 目录 前言 正文 解析 分派 静态分派 动态分派 单分派和多分派 动态分派的实现 Lambda表达式的实现原理 MethodHandle 总结 前言 在最开始讲解JVM内存结构的时候有简单分析过方 ...

随机推荐

  1. pyc是什么

    python是解释型语言,需要解释器对程序逐行做出解释,然后直接运行. C语言是编译型语言,PC不需要翻译,直接执行就可以了. java也是解释型语言,不过速度可以跟编译型媲美. 用java举例,ja ...

  2. JNI的一个简单实例

    本例子使用的操作系统MacOS, 64位JVM. JNI编写的几个步骤如下: 编写Java代码,并注明native方法: public class HelloJni { public native v ...

  3. 02:Sysbench基准压测(oltp_update_index.lua、oltp_update_non_index.lua)my.cnf

    目录 Sysbench 基准压测 my.cnf 一.Sysench测试前准备 1.1.压测环境 二.进行OLTP_update测试 2.1.安装压测工具sysbench 2.2.执行压测 三.执行结果 ...

  4. 【洛谷】P2434 [SDOI2005]区间(暴力)

    题目描述 现给定n个闭区间[ai, bi],1<=i<=n.这些区间的并可以表示为一些不相交的闭区间的并.你的任务就是在这些表示方式中找出包含最少区间的方案.你的输出应该按照区间的升序排列 ...

  5. 【洛谷】P2694 接金币(排序)

    题目描述 在二维坐标系里,有N个金币,编号0至N-1.初始时,第i个金币的坐标是(Xi,Yi).所有的金币每秒向下垂直下降一个单位高度,例如有个金币当前坐标是(xf, yf),那么t秒后金币所在的位置 ...

  6. 在CentOS 7中使用VS Code编译调试C++项目

    1. 安装VSCODE 见VSCode官方链接 https://code.visualstudio.com/docs/setup/linux#_rhel-fedora-and-centos-based ...

  7. python开发_python中的变量:全局变量和局部变量

    如果你在为python中的变量:全局变量和局部变量头疼,我想这篇blog会给你帮助 运行效果: 代码部分: #Python中的变量:全局变量和局部变量 #在很多语言中,在声明全局变量的时候,都喜欢把全 ...

  8. postman 中url有动态变换的值时,可以按下面方式变换。

    get 和post均适用.

  9. DataMatrix二维条码源码分析检测识别图像位置

    发布时间:2014-10-31 DataMatrix的代码结构和QR码基本相同: 其中Detector的功能还是从原始图像中找出符号码的部分,并且进行透视转换纠正扭曲. 其解码流程与QR码差不多,关键 ...

  10. 获取用户的相关请求信息, 以及包括请求头 request.environ

    #在index文件中 1. print(type(request)) #看出所属库 2. from django.core.handlers.wsgi import WSGIRequest #查看WS ...