[GO]方法值和方法表达式
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]方法值和方法表达式的更多相关文章
- GO的方法值和方法表达式用法
手册上关于这块的解释感觉不是很详细清晰,经过几个示例自己总结了下这块的用法. 方法表达式:说简单点,其实就是方法对象赋值给变量. 这里有两种使用方式: 1)方法值:隐式调用, struct实例获取方法 ...
- 编写高质量代码改善C#程序的157个建议[为泛型指定初始值、使用委托声明、使用Lambda替代方法和匿名方法]
前言 泛型并不是C#语言一开始就带有的特性,而是在FCL2.0之后实现的新功能.基于泛型,我们得以将类型参数化,以便更大范围地进行代码复用.同时,它减少了泛型类及泛型方法中的转型,确保了类型安全.委托 ...
- .net学习之新语法学习(匿名类和匿名方法,扩展方法,系统内置委托,Lambda表达式和linq等)
1.自动属性 Auto-Implemented Properties 2.隐式类型 var var变量不能作为全局变量使用,因为不能在编译时确定类型 3.参数默认值 和 命名参数 4.对象初始化器 ...
- Effective Java 第三版——43.方法引用优于lambda表达式
Tips <Effective Java, Third Edition>一书英文版已经出版,这本书的第二版想必很多人都读过,号称Java四大名著之一,不过第二版2009年出版,到现在已经将 ...
- LINQ to Entities 不识别方法“System.String get_Item(Int32)”,因此该方法无法转换为存储表达式。
1.LINQ to Entities 不识别方法“System.String get_Item(Int32)”,因此该方法无法转换为存储表达式.项目中发现linq to entities 不识别? , ...
- scala学习手记38 - 方法命名约定和for表达式
方法命名约定 之前在学习<运算符重载>一节时曾经说过一个方法命名约定:方法的第一个字符决定了方法的优先级.现在再说另一个命名约定:如果方法以冒号(:)结尾,则调用目标是运算符后面的实例. ...
- 委托+内置委托方法+多播委托+lambda表达式+事件
委托概念:如果我们要把方法当做参数来传递的话,就要用到委托.简单来说委托是一个类型,这个类型可以赋值一个方法的引用. 声明委托: 在C#中使用一个类分两个阶段,首选定义这个类,告诉编译器这个类由什么字 ...
- mysql 清空或删除表数据后,控制表自增列值的方法
http://blog.sina.com.cn/s/blog_68431a3b0100y04v.html 方法1: truncate table 你的表名 //这样不但将数据全部删除,而且重新定位自增 ...
- 深入探究JVM之方法调用及Lambda表达式实现原理
@ 目录 前言 正文 解析 分派 静态分派 动态分派 单分派和多分派 动态分派的实现 Lambda表达式的实现原理 MethodHandle 总结 前言 在最开始讲解JVM内存结构的时候有简单分析过方 ...
随机推荐
- python稀疏矩阵得到每列最大k项的值,对list内为类对象的排序(scipy.sparse.csr.csr_matrix)
print(train_set.tdm) print(type(train_set.tdm)) 输出得到: (0, 3200) 0.264940780338 (0, 1682) 0.356545827 ...
- 北京师范大学第十六届程序设计竞赛决赛 I 如何办好比赛
链接:https://www.nowcoder.com/acm/contest/117/I来源:牛客网 如何办好比赛 时间限制:C/C++ 1秒,其他语言2秒 空间限制:C/C++ 32768K,其他 ...
- [转]Jsp 页面中的错误
1. Jsp 语法格式问题,导致其不能被翻译成 Servlet 源文件. 2. Jsp 翻译成 Servlet 源文件后出现的语法格式问题. 3. Jsp 翻译成 Servlet 后运行时发生异常.
- SpringBoot中RedisTemplate订阅发布对象
解说 RedisMessageListenerContainer Redis订阅发布的监听容器,你的消息发布.订阅配置都必须在这里面实现 addMessageListener(MessageListe ...
- 【学习笔记】Manacher
扔板子跑路 代码 POJ3974 #include <cstdio> #include <cstring> #include <algorithm> using n ...
- 使用国内源部署ceph
由于网络方面的原因,Ceph的部署经常受到干扰,通常为了加速部署,基本上大家都是将Ceph的源同步到本地进行安装.根据Ceph中国社区的统计,当前已经有国内的网站定期将Ceph安装源同步,极大的方便了 ...
- Android 4 学习(20):ActionBar
参考<Pro Android 4.0> ActionBar 11.0之后,ActionBar在Activity中默认存在,可以在代码中设置其显示与否: ActionBar actionBa ...
- 关于 warning CS0659:“***”重写Object.Equals(object o)但不重写Object.GetHashCode()
对象相等性和同一性 System.Object 类型提供了以下方法, namespace System { // // 摘要: // 支持 .NET Framework 类层次结构中的所有类,并为派生 ...
- leetcode705
class MyHashSet { public: /** Initialize your data structure here. */ MyHashSet() { } void add(int k ...
- EF中关系映射问题
一对一,和一对多的简单问题就部说了,直接来多对多这样的问题吧. 首现关系映射为这样的: /// <summary> /// 对应数据库中dbo.Address表 /// </summ ...