原文: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. oracle 的安装 及环境的配置...

    前言 最近这段时间和香港同事一起做项目  负责给日本客户做一个产品  使用的是Oracle 数据库   在一开始项目启动时一直报和oracle数据库有关    本机在这之前就已经安装好了    由于使 ...

  2. DDL数据库对象管理

    DDL数据库对象管理 约束的分类: 主键约束:primary key 要求主键列数据唯一,并且不允许为空. 外键约束:foreign key 用于在两表之间建立关系,需要指定引用主表的哪一列. 检查约 ...

  3. 将mysql中一行中的几个字段 转换成一列并从其他数据库中查对应的邮件信息

    --将项目中的总监,经理,等的邮箱合并为一行 SELECT GROUP_CONCAT(t.USER_EMAIL SEPARATOR ' ') mail_address FROM portal.t_ac ...

  4. Chrome浏览器控制台报 POST http://*** net::ERR_BLOCKED_BY_CLIENT

    开发项目广告模块时,遇到前端提交的请求后台拿不到,好像被什么拦截了,查看了过滤器,拦截器都无错误,且请求也到不了拦截器,chrome浏览器报:ERR_BLOCKED_BY_CLIENT错误 搞腾一半天 ...

  5. (十)springMvc 校验

    目录 文章目录 目录 @[toc] springMvc 校验 准备 踩坑 配置校验器 将校验器注入到适配器中 在 pojo 中配置校验规则 在 controller 层进行检验 获取错误信息 将错误信 ...

  6. (十三)mybatis 整合 ehcache

    目录 ehcache mybatis 的 Cache 接口 整合步骤 ehcache ehcache 是一个分布式缓存框架 ! 为什么需要分布式缓存? 在大型的项目中,服务器是肯定不止一台的,每台服务 ...

  7. 护卫神等IIS设置Thinkphp框架的public目录为根目录的解决办法

    最近碰到一个棘手的问题,在使用护卫神或者主机宝等IIS环境配置PHP的时候,不能把public设置为网站根目录(因为Thinkphp的安全要求:要将public设置为对外公开目录),这个问题无法搜索到 ...

  8. Pygame小游戏练习三

    @Python编程从入门到实践 Python项目练习 七.创建Passenger类 创建passenger.py文件,创建Passenger类,控制乘客属性和行为 # passenger.py imp ...

  9. pb相关小技巧或用法

    1.动态post window lwlw = w_main lw.dynamic post event ue_all(ls_no,ls_table) 2.打开隐藏窗口 IF NOT IsValid(w ...

  10. 怎样获取所有的embed节点对象

    <embed>是H5中新增的标签, 可以通过: document.embeds 和 document.plugins 获取所有的 embed 节点 document.embeds === ...