博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
golang中方法的receiver为指针和不为指针的区别
阅读量:7222 次
发布时间:2019-06-29

本文共 1448 字,大约阅读时间需要 4 分钟。

前言

最近看网站有同学提问golang中方法的receiver为指针和不为指针有什么区别,在这里我以简单易懂的方法进行说明,帮助刚刚学习golang的同学.

方法是什么

其实只要明白这个原理,基本就能理解上面提到的问题.

方法其实就是一种特殊的函数,receiver就是隐式传入的第一实参.

举个例子

type test struct{    name string}func (t test) TestValue() {}func (t *test) TestPointer() {}func main(){    t := test{}        m := test.TestValue    m(t)        m1 := (*test).TestPointer    m1(&t)    }

是不是很简单就明白了呢?现在我们来加入代码,来看看指针和非指针有什么区别.

type test struct{    name string}func (t test) TestValue() {    fmt.Printf("%p\n", &t)}func (t *test) TestPointer() {    fmt.Printf("%p\n", t)}func main(){    t := test{}    //0xc42000e2c0    fmt.Printf("%p\n", &t)        //0xc42000e2e0    m := test.TestValue    m(t)        //0xc42000e2c0    m1 := (*test).TestPointer    m1(&t)    }

估计有的同学已经明白了,当不是指针时传入实参后值发生了复制.所以每调用一次TestValue()值就发生一次复制.

那如果涉及到修改值的操作,结果会是怎样呢?

type test struct{    name string}func (t test) TestValue() {    fmt.Printf("%s\n",t.name)}func (t *test) TestPointer() {    fmt.Printf("%s\n",t.name)}func main(){    t := test{"wang"}    //这里发生了复制,不受后面修改的影响    m := t.TestValue        t.name = "Li"    m1 := (*test).TestPointer    //Li    m1(&t)            //wang    m()}

所以各位同学在编程遇到此类问题一定要注意了.

那这些方法集之间到底是什么关系呢?这里借用了qyuhen在的话,这里也推荐喜欢golang的朋友去阅读这本书,对加深理解golang有很大的帮助.

• 类型 T 法集包含全部 receiver T 法。

• 类型 T 法集包含全部 receiver T + T 法。
• 如类型 S 包含匿名字段 T,则 S 法集包含 T 法。
• 如类型 S 包含匿名字段 T,则 S 法集包含 T + T 法。
• 不管嵌 T 或 T,S 法集总是包含 T + *T 法。

结语

golang虽然上手简单易用,但是还是有很多坑.作者在使用golang过程中就遇到很多坑,后面会在博客中提出,欢迎大家一起讨论.

转载地址:http://jvhym.baihongyu.com/

你可能感兴趣的文章
poj1063 解题报告(poj 1063 analysis report)
查看>>
.NET 邮件传送功能实现(smtp.qq.com)
查看>>
数组 (6.6)
查看>>
转载:IE下div使用margin:0px auto不居中的原因
查看>>
Retro 2013
查看>>
学习:类的多属性问题。
查看>>
RedHat Linux下注册Apache为系统服务并设为开机启动
查看>>
iOS: 获取文件路径
查看>>
纸上谈兵: 树, 二叉树, 二叉搜索树[转]
查看>>
[leetcode]Simplify Path @ Python
查看>>
JavaWeb学习----Cookie实现记住密码的功能
查看>>
安卓开发_慕课网_百度地图_实现方向传感器
查看>>
Java程序员25个必备的Eclipse插件
查看>>
详解Linux配置iSCSI方法
查看>>
使用 Dalvik 调试监控服务 (DDMS) 工具
查看>>
OpenGL研究2.0 计算圆
查看>>
专业上的常用的工具和类库集 By 老衣
查看>>
firefox与chrome中对select下拉框中的option支持问题
查看>>
JetBrains PyCharm 4.0.4 key
查看>>
随机产生32位字符串
查看>>