[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中scipy学习——随机稀疏矩阵及操作
1.生成随机稀疏矩阵: scipy中生成随机稀疏矩阵的函数如下: scipy.sparse.rand(m,n,density,format,dtype,random_state) 1 参数介绍: 参数 ...
- 杂项-数学软件:Maple
ylbtech-杂项-数学软件:Maple Maple是目前世界上最为通用的数学和工程计算软件之一,在数学和科学领域享有盛誉,有“数学家的软件”之称.Maple 在全球拥有数百万用户,被广泛地应用于科 ...
- Oralce OMF 功能详解
OMF,全称是Oracle_Managed Files,即Oracle文件管理,使用OMF可以简化管理员的管理工作,不用指定文件的名字.大小.路径,其名字,大小, 路径由oracle 自动分配.在删除 ...
- Java toString()方法
JDK API java.lang 的Object类中的toString()方法 toString public String toString() 返回该对象的字符串表示.通常,toString 方 ...
- eyoucms 前台 getshell 复现
漏洞地址:http://www.sch01ar.com/index.php/api/Uploadify/preview 这样子说明存在漏洞 对 <?php phpinfo(); 进行 base6 ...
- leetcode two pointer
16. 3Sum Closest 这道题让我们求最接近给定值的三数之和,是在之前那道3Sum 三数之和的基础上又增加了些许难度,那么这道题让我们返回这个最接近于给定值的值,即我们要保证当前三数和跟给定 ...
- 腾讯安全反病毒实验室解读“Wannacry”勒索软件
背景 针对昨日英国医院被攻击,随后肆虐中国高校的 WannaCry 勒索事件,腾讯安全反病毒实验室第一时间给出了深度权威的分析.此次勒索事件与以往相比最大的亮点在于,勒索病毒结合了蠕虫的方式进行传播, ...
- BDE View not exists
Table does not exist. [Microsoft][ODBC SQL Server Driver][SQL Server]对象名 'vw1' 无效.
- ffmpeg基本用法(转)
FFmpeg FFmpeg 基本用法 本课要解决的问题 1.FFmpeg的转码流程是什么? 2.常见的视频格式包含哪些内容吗? 3.如何把这些内容从视频文件中抽取出来? 4.如何从一种格式转换为另一种 ...
- MySQL数据库篇之单表查询
主要内容: 一.单表查询的语法 二.关键字的执行优先级 三.简单查询 四.where约束 五.分组查询 group by 六.having过滤 七.查询排序 order by 八.限制查询的记录数 l ...