关于golang中方法的receiver为指针和不为指针的区别


本文摘自php中文网,作者藏色散人,侵删。

下面由golang教程栏目给大家介绍golang中方法的receiver为指针和不为指针的区别,希望对需要的朋友有所帮助!

golang中方法的receiver为指针和不为指针的区别

前言

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

方法是什么

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

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

举个例子

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

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)   

}

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

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

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()值就发生一次复制.
那如果涉及到修改值的操作,结果会是怎样呢?

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

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的朋友去阅读这本书,对加深理解golang有很大的帮助.

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

结语

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

以上就是关于golang中方法的receiver为指针和不为指针的区别的详细内容,更多文章请关注木庄网络博客!!

相关阅读 >>

搭建coolpy+mqtt 服务

golang交叉编译简述

[系列] go - 统一定义 api 错误码

手撸golang 行为型设计模式 命令模式

希尔排序

easydss如何定制go语言生成csv文件?

手撸golang go与微服务 net.rpc之1

【raspberry pi】编译安装etcd集群

go 1.15 版本的优化清单【总结】

毛剑:bilibili 的 go 服务实践(上篇)

更多相关阅读请进入《golang》频道 >>




打赏

取消

感谢您的支持,我会继续努力的!

扫码支持
扫码打赏,您说多少就多少

打开支付宝扫一扫,即可进行扫码打赏哦

分享从这里开始,精彩与您同在

评论

管理员已关闭评论功能...