原文:https://blog.csdn.net/u014633283/article/details/83826413

------------------------------------------------------

1. 写在前面
文章的标题读起来是有点拗口的,用一个简单的示例大家便可以一目了然了,如下所示,st2会被自动解引用从而调用StructTest的printData方法,而st3会被自动取引用从而调用StructTest2的printData方法。
但很多时候,我们会发现这种自动的“取引用”或“解引用”不“奏效”了,尤其是遇到接口的时候,本文就是通过代码复现这种“不奏效”,并分析其中的原因。

package main

import "fmt"

type StructTest struct{
data string
} func (st StructTest) printData() {
fmt.Println(st.data)
} type StructTest2 struct {
data string
} func (st *StructTest2) printData(){
fmt.Println(st.data)
} func main() {
st1 := StructTest{data: "seafooler"}
st1.printData() st2 := &(StructTest{data: "seafooler"})
st2.printData() st3 := StructTest2{data: "seafooler"}
st3.printData() st4 := &(StructTest{data: "seafooler"})
st4.printData()
}
---------------------
作者:落日沧海
来源:CSDN
原文:https://blog.csdn.net/u014633283/article/details/83826413
版权声明:本文为博主原创文章,转载请附上博文链接!

  

2. 自动“取引用”或“解引用”遇到“接口”
2.1 现象
我们还是用代码举例,如下所示,我们定义一个接口InterfaceTest,并定义了两个实现该接口的类StructTest和StructTest2。在main函数中,我们分别将实现类的变量的值或者引用赋值给接口变量,并通过接口变量来调用printData方法。发现程序中it3的赋值会出现编译错误。

package main

import "fmt"

type InterfaceTest interface {
printData()
} type StructTest struct {
data string
} func (st StructTest) printData() {
fmt.Println(st.data)
} type StructTest2 struct {
data string
} func (st *StructTest2) printData() {
fmt.Println(st.data)
} func main(){
st := StructTest{data: "seafooler"}
var it1 InterfaceTest = st
it1.printData() var it2 InterfaceTest = &st
it2.printData() st2 := StructTest2{data: "seafooler"}
var it3 InterfaceTest = st2 // 编译出错
it3.printData() var it4 InterfaceTest = &st2
it4.printData()
}
---------------------
作者:落日沧海
来源:CSDN
原文:https://blog.csdn.net/u014633283/article/details/83826413
版权声明:本文为博主原创文章,转载请附上博文链接!

  

2.2 原因
原因是因为,对于一个类来说,其值类型的方法会自动生成相应的指针类型的方法,而指针类型的方法不会自动生成相应的值类型的方法。在我们的程序示例中:

StructTest值类型的printData方法会自动生成一个func (st *StructTest) printData()方法,因此*StructTest也是符合InterfaceTest接口的。
相反,StructTest2指针类型的printData方法不会自动生成一个func (st StructTest2) printData()方法,因此StructTest2不符合InterFaceTest接口,也就不能将st2赋值给it3
3. 总结
我们在谈到变量的自动“取引用”和“解引用”时,往往是指在进行“方法调用”的时候。而第2部分的示例代码中,涉及到类型的匹配,那就是另外一个问题了,涉及到的是新的相应方法的生成。值类型的方法总会生成一个对应的指针类型方法,反之则不可以
---------------------
作者:落日沧海
来源:CSDN
原文:https://blog.csdn.net/u014633283/article/details/83826413
版权声明:本文为博主原创文章,转载请附上博文链接!

Golang对方法接收者变量的自动“取引用”和“解引用”的更多相关文章

  1. 详解C++中指针(*)、取地址(&)、解引用(*)与引用(&)的区别 (完整代码)

    一.初步了解--指针与取地址 先看程序: #include<cstdio> int main(void) { int num = 7; int *p = &num; printf( ...

  2. 取地址与解引用 C指针浅析

    C语言指针入门需要掌握的两个概念就是取地址&和解引用*,下面我们按例子来理解这两个符号的使用. int main() { int a = 0; int* pa = &a;//取地址操作 ...

  3. golang 方法接收者

    [定义]: golang的方法(Method)是一个带有receiver的函数Function,Receiver是一个特定的struct类型,当你将函数Function附加到该receiver, 这个 ...

  4. Golang之方法(自定义类型,struct)

    方法的使用,请看本天师的代码 //Golang的方法定义 //Golang中的方法是作用在特定类型的变量上,因此自定义类型,都可以有方法,不仅仅是struct //定义:func (recevier ...

  5. Golang 函数 方法 接口的简单介绍

    函数 函数是基本的代码块,通常我们会将一个功能封装成一个函数,方便我们调用,同时避免代码臃肿复杂. 函数的基本格式 func TestFunc(a int, b string) (int, strin ...

  6. GoLang之方法与接口

    GoLang之方法与接口 Go语言没有沿袭传统面向对象编程中的诸多概念,比如继承.虚函数.构造函数和析构函数.隐藏的this指针等. 方法 Go 语言中同时有函数和方法.方法就是一个包含了接受者的函数 ...

  7. block(代码块)的介绍以及使用方法和变量之间的关系

    http://blog.csdn.net/menxu_work/article/details/8762848 block(代码块)的介绍以及使用方法和变量之间的关系 block(代码块)的介绍以及使 ...

  8. 如何解决eclipse、MyEclipse中变量名自动补全问题

    背景:这个问题困扰了很长时间,解决过程也并不顺利.不断的试错,再次让我理解这下面这句话—— 世界上对的路可能只有一条,错的路却可能有成千上万条,不要成为别人的前车之鉴.开发之路,只需要记住对的路就行了 ...

  9. 关于pyhton中的__xxx__格式的方法与变量的理解

    python中类似__xx__的方法和变量是python系统内定义的方法和变量,都是具有特殊意义的基础变量和方法,一般不要擅自使用,除非知道自己在干什么. 具体查看python内置模块builtins ...

随机推荐

  1. 【转】MySql 三大知识点——索引、锁、事务

    索引 索引,类似书籍的目录,可以根据目录的某个页码立即找到对应的内容. 索引的优点:1. 天生排序.2. 快速查找. 索引的缺点:1. 占用空间.2. 降低更新表的速度. 注意点:小表使用全表扫描更快 ...

  2. elasticsearch 的post put 方式的对比 setting mapping设置 - 添加查询数据

    1.POST和PUT都可以用于创建 2.PUT是幂等方法,POST不是.所以post用户更新,put用于新增比较合适. 参考:https://yq.aliyun.com/articles/366099 ...

  3. c++ 行为型_备忘录模式(Memento)

    行为型_备忘录模式(Memento) 作用场景: 当意图在对象外面保存对象的内部状态,但是又不想破坏对象的封装性,就可以考虑备忘录模式. 解释: 其参与者包括 1.Memnto(备忘录,如下列Coun ...

  4. go语言操作kafka

    go语言操作kafka Kafka是一种高吞吐量的分布式发布订阅消息系统,它可以处理消费者规模的网站中的所有动作流数据,具有高性能.持久化.多副本备份.横向扩展等特点.本文介绍了如何使用Go语言发送和 ...

  5. 牛客 26E 珂学送分2 (状压dp)

    珂...珂...珂朵莉给你出了一道送分题: 给你一个长为n的序列{vi},和一个数a,你可以从里面选出最多m个数 一个合法的选择的分数定义为选中的这些数的和加上额外规则的加分: 有b个额外的规则,第i ...

  6. Mybatis 多个参数传入的多种方法

    ist<XXXBean> getXXXBeanList(HashMap map); <select id="getXXXBeanList" parameterTy ...

  7. 给枚举定义DescriptionAttribute

    在C#中,枚举用来定状态值很方便,例如我定义一个叫做Season的枚举 public enum Season { Spring = 1, Summer = 2, Autumn = 3, Winter ...

  8. Faster RCNN学习笔记

    感谢知乎大神的分享 https://zhuanlan.zhihu.com/p/31426458 Ross B. Girshick在2016年提出了新的Faster RCNN,在结构上,Faster R ...

  9. SQL Prompt 注册后隔一段时间莫名无法使用的处理

    https://blog.csdn.net/anyqu/article/details/88537197 以前一直以为是授权丢了,反复重装也解决不了 Sql Prompt---Unable to co ...

  10. 感兴趣的WebGL ,来自微博的一个全景星空图~

    https://m.weibo.cn/z/panorama?oid=1042143:ee51daffe7e7f497069af8c74840bbc2 还有一些好玩的相关链接 http://webgls ...