Golang对方法接收者变量的自动“取引用”和“解引用”
原文: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对方法接收者变量的自动“取引用”和“解引用”的更多相关文章
- 详解C++中指针(*)、取地址(&)、解引用(*)与引用(&)的区别 (完整代码)
一.初步了解--指针与取地址 先看程序: #include<cstdio> int main(void) { int num = 7; int *p = # printf( ...
- 取地址与解引用 C指针浅析
C语言指针入门需要掌握的两个概念就是取地址&和解引用*,下面我们按例子来理解这两个符号的使用. int main() { int a = 0; int* pa = &a;//取地址操作 ...
- golang 方法接收者
[定义]: golang的方法(Method)是一个带有receiver的函数Function,Receiver是一个特定的struct类型,当你将函数Function附加到该receiver, 这个 ...
- Golang之方法(自定义类型,struct)
方法的使用,请看本天师的代码 //Golang的方法定义 //Golang中的方法是作用在特定类型的变量上,因此自定义类型,都可以有方法,不仅仅是struct //定义:func (recevier ...
- Golang 函数 方法 接口的简单介绍
函数 函数是基本的代码块,通常我们会将一个功能封装成一个函数,方便我们调用,同时避免代码臃肿复杂. 函数的基本格式 func TestFunc(a int, b string) (int, strin ...
- GoLang之方法与接口
GoLang之方法与接口 Go语言没有沿袭传统面向对象编程中的诸多概念,比如继承.虚函数.构造函数和析构函数.隐藏的this指针等. 方法 Go 语言中同时有函数和方法.方法就是一个包含了接受者的函数 ...
- block(代码块)的介绍以及使用方法和变量之间的关系
http://blog.csdn.net/menxu_work/article/details/8762848 block(代码块)的介绍以及使用方法和变量之间的关系 block(代码块)的介绍以及使 ...
- 如何解决eclipse、MyEclipse中变量名自动补全问题
背景:这个问题困扰了很长时间,解决过程也并不顺利.不断的试错,再次让我理解这下面这句话—— 世界上对的路可能只有一条,错的路却可能有成千上万条,不要成为别人的前车之鉴.开发之路,只需要记住对的路就行了 ...
- 关于pyhton中的__xxx__格式的方法与变量的理解
python中类似__xx__的方法和变量是python系统内定义的方法和变量,都是具有特殊意义的基础变量和方法,一般不要擅自使用,除非知道自己在干什么. 具体查看python内置模块builtins ...
随机推荐
- 【IDEA】格式化代码技巧汇总
1.格式化 Java 代码 快捷键:Ctrl+Alt+L 2.格式化 Mapper 文件中的 SQL 关联到数据库,让 IDEA 认识你的 SQL.如何关联?选择右侧的database,添加数据库即可 ...
- 第34课.数组操作符的重载("[]"重载)
1.问题:string类对象还具备c方式字符串的灵活性吗?还能直接访问单个字符吗? 答案:可以按照c字符串的方式使用string对象 string s = "a1b2c3d4e"; ...
- 0《STL源码剖析》简介
STL源码剖析 ----侯捷 STL主要包括六个组件: 1.配置器:负责空间配置和管理. 2.迭代器:扮演容器和算法之前的胶合剂,所谓“泛型指针”. 3.容器:各种数据结构,如vector,list, ...
- 《xv6 Appendices: PC Hardware and Boot loader》学习笔记
MIT 6.828 Lecture 2的preparation要求阅读<xv6 book>的附录部分,附录包括"PC Hardware"和"The Boot ...
- python查询neo4j的数据以字典的方式返回数据
在使用python操作neo4j的时候,如果查询的数据比较多,结构比较复杂的时候,返回的数据量会比较大,而且信息比较多,并且不唯一.所以写了该方法,用于查询比较复杂的数据. def query_gra ...
- PHP max_input_var设为了1000导致post数组太多时无法接受后面的参数值
PHP max_input_var设为了1000导致post数组太多时无法接受后面的参数值 下午突然接到格力电话说无法批量设置门店任务,但是在测试环境下无法重现,测试环境下好好的. 然后登陆到生产环境 ...
- k8s之网络插件flannel及基于Calico的网络策略
1.k8s网络通信 a.容器间通信:同一个pod内的多个容器间的通信,通过lo即可实现; b.pod之间的通信:pod ip <---> pod ip,pod和pod之间不经过任何转换即可 ...
- 训练技巧详解【含有部分代码】Bag of Tricks for Image Classification with Convolutional Neural Networks
训练技巧详解[含有部分代码]Bag of Tricks for Image Classification with Convolutional Neural Networks 置顶 2018-12-1 ...
- Git 集成 Araxis Merge 作为比较和合并GUI工具的配置 参考自https://www.kancloud.cn/leviio/git/369125
Git 集成 Araxis Merge Win10下修改git全部配置文件方法Git 集成 Araxis Merge 作为比较和合并GUI工具的配置 那global对应的 ,gitconfig文件在哪 ...
- 前端性能优化-Vue代码层面
1.v-if 和 v-show 区分使用场景 v-if 是 真正 的条件渲染,因为它会确保在切换过程中条件块内的事件监听器和子组件适当地被销毁和重建:也是惰性的:如果在初始渲染时条件为假,则什么也不做 ...