【Go】A和*A在作为Receiver和接口实现上的差别

内容均来自 https://www.bilibili.com/video/BV1Eb4y1F7b9
https://juejin.cn/post/6963476381728702501

什么时候要使用指针接收器?
1.A很大,因为Go语言在执行函数时会进行参数的拷贝,拷贝一个大的对象和拷贝一个
指针相比代价肯定要大。
2.当方法中要修改A本身的数据时。同样是因为拷贝的原因,对于拷贝对象的修改不
会影响原对象

type I1 interface{F1()
}
type I2 interface{F1()F2()
}
type T1 struct{d int
}
func(t T1)F1(){fmt.Printin("F1",t.d)
}
func(t *T1)F2(){fmt.Printin("F2",t.d)
}
//OK
var _ I1=T1
//OK
var _ I1=&T1
//OK
var _ I2=&T1
//Not OK
var _ I2=T1

如果一个类型A实现了某方法,就相当于*A也实现了该方法。
反过来不成立。

前提A本身不能是指针类型,如果*A实现了某方法,对于**A没有影响。
所以A实现了的接口,*A一定也实现了。
反过来不一定。

A是如何调用*A的方法的 (互相调用)

可以认为是golang中的一种语法糖

func (s *mystruct)Read(data []byte)(int,error){return 0,nil
} 如果有了上面的不允许再定义下面的
func (s myStruct)Read(data []byte)(int,error){return 0,nil
}不管在上面是谁实现了Read方法,下面的两段代码都是0K的
a:=mystruct{}
a.Read(nil)b:=&mystruct{}
b.Read(nil)
type A structd int
}
func(a *A)F1(× int)(a.d+=x
}
func main(){a:=A{d:10}a.F1(5)  //等于(&a).F1(5)fmt.Println(a.d)
}
type A struct{d int
}
func(a A)F2(x int){a.d+=x
}
func main(){a:=&A{d:10}a.F2(5)  //等于(*a).F2(5)fmt.Println(a.d)//结果还是10
}

*A拥有A的所有方法。对A的方法做了包装,先做指针解引用,再调用A的方法。
*A的变量可以直接调用A的方法,处理逻辑同上
可以理解为语法糖,也可以理解为对于上面的包装后的方法的调用。

A没有A的方法
A的变量可以直接调用
A的方法,处理逻辑是先取指针,再调用*A的方法。
只能理解为是语法糖。

https://stackoverflow.com/questions/48790663/why-value-stored-in-an-interface-is-not-addressable-in-golang
https://go.dev/doc/faq#different_method_sets

为什么要让*A拥有A的所有方法?
可能的原因:
1.*A调用A的方法的过程总是安全的。
2.*A调用A的方法的结果总是符合预期的,而且是有益的。
不太可能是因为接口实现的需要而实现这样的特性。
1.这是在Go的Spec里面设定的行为,正常的顺序是Spec在前,实现在后。
2.Go语言在设计层面并没有对接口实现做设定,所以不允许取接口的地址

为什么不让A拥有*A的方法?

看一个例子,假设A拥有*A的方法,下面的代码将是正确的,但是结果不符合预期
var buf bytes.Buffer
io.Copy(buf,os.Stdin)//将数据拷贝到buf里面//相关代码
func Copy(dst Writer,src Reader)(written int64,err error){return copyBuffer(dst,src,nil)
}
type Writer interface{Write(p []byte)(n int,err error)
}
func (b *Buffer)Write(p []byte)(n int,err error){
}

如果让A拥有A的方法,也就是让A实现A所实现的接口,此时将A作为接口类型的变量使用,与*A的行为是有差异的,而且是我们不想要的行为。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/632461.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Jenkins-Pipeline

Pipeline 1 安装插件 2 新建一个 Pipline 工程 3 配置Pipeline 脚本 agent的使用可以参考这个文档 pipeline {agent anystages {stage(Build) { steps {echo Building project...}}stage(Test) { steps {echo Testing project...}}stage(Deploy) { steps {echo Deploying …

java基础之线程安全问题以及线程安全集合类

线程安全问题 当多个线程同时访问同一个临界资源时,原子操作可能被破坏,会导致数据丢失, 就会触发线程安全问题 临界资源: 被多个线程同时访问的对象 原子操作: 线程访问临界资源的过程中不可更改和缺失的操作 互斥锁 每个对象都默认拥有互斥锁, 该锁默认不开启. 当开启互斥…

Go新项目-Gin中wire的依赖注入方式实战(6)

选型Go项目过程中,针对依赖注入方式的分析和使用 参考资料 https://go.dev/blog/wirehttps://medium.com/dche423/master-wire-cn-d57de86caa1bhttps://toutiao.io/posts/et0t2lk/previewhttps://imlht.com/archives/223/https://lailin.xyz/post/go-training-week…

即将被AI取代的工作

这个博客 100% 是由人类而不是机器人撰写的。至少在某种程度上,目前仍然需要内容作家。 你的工作怎么样?您是否想过人工智能(AI)是否有可能渗透到您生活的无形本质?您花费数年时间获得的所有知识、技能和经验是否会因…

谈谈前端开发中的防抖和节流

本文作者为 360 奇舞团前端开发工程师 李武阳 概述 防抖和节流是前端开发中常用的函数优化手段,它们可以限制函数的执行频率,提升性能和用户体验。主要用于处理高频触发的事件,例如:用户的滚动、输入、点击和表单的重复提交等。 防…

OceanBase OBCA认证考试预约流程

【OceanBase】OBCA认证考试预约流程 - 课程体系 - 云贝教育https://www.yunbee.net/Home/News/detail/article_id/541.html 一、OBCA账号登录/注册,链接 https://www.oceanbase.com/ob/login/mobile?gotohttps%3A%2F%2Fwww.oceanbase.com%2Ftraining%2Fdetail%3Fle…

Windows Redis图形客户端 Another Redis Desktop Manager的简单使用教程

1、 Redis官方文档 2、 Redis国内中文版文档 3、 Redis客户端 Another Redis Desktop Manager 4、连接redis服务 我直接使用的是公司搭建好的服务。连接服务需要以下几个信息: HostPortPasswordSSL 5、New Key 5.1 如何创建一个Key? 点击New k…

从前端角度浅谈性能 | 京东物流技术团队(转载)

1 前言 自网站诞生以来,页面白屏时间、用户交互的响应速度等一直都是开发者关心的问题,这直接影响了一个网站能否为用户的浏览提供舒适的服务,而这种舒适度,直接关系着对用户的吸引力,毕竟谁都不能忍受一个页面长达10秒…

webassembly003 whisper.cpp的项目结构CMakeLists.txt

注:带星号的为非重要部分 基础配置 cmake_minimum_required (VERSION 3.5)project(whisper.cpp VERSION 1.5.0)# Add path to modules list(APPEND CMAKE_MODULE_PATH "${CMAKE_CURRENT_SOURCE_DIR}/cmake/") # 在\cmake文件夹下还有BuildTypes.cmake&a…

Uboot-5(U-Boot源码分析1-启动第一阶段)

来源:朱有鹏老师的嵌入式linux核心教程 1、start.S引入 1.1、u-boot.lds中找到start.S入口 (1)、在C语言中整个项目的入口就是main函数(这是C语言规定的),所以譬如说一个有10000个.c文件的项目,第一个要分析的文件就…

Go 中 slice 的 In 功能实现探索

文章目录 遍历二分查找map key性能总结 之前在知乎看到一个问题:为什么 Golang 没有像 Python 中 in 一样的功能?于是,搜了下这个问题,发现还是有不少人有这样的疑问。 补充:本文写于 2019 年。GO 现在已经支持泛型&am…

腾讯云 腾讯云服务器 - 腾讯云 产业智变·云启未来

腾讯云服务器CVM提供安全可靠的弹性计算服务,腾讯云明星级云服务器,弹性计算实时扩展或缩减计算资源,支持包年包月、按量计费和竞价实例计费模式,CVM提供多种CPU、内存、硬盘和带宽可以灵活调整的实例规格,提供9个9的数…

【工作记录】基于springboot3+springsecurity6实现多种登录方式(一)

前言 springboot3已经推出有一段时间了,近期公司里面的小项目使用的都是springboot3版本的,安全框架还是以springsecurity为主,毕竟亲生的。 本文针对基于springboot3和springsecurity实现用户登录认证访问以及异常处理做个记录总结&#x…

Linux miniGUI移植分析

框架介绍 常用GUI程序对比 https://www.cnblogs.com/zyly/p/17378659.html MiniGUI分为底层的GAL(图形抽象层)和IAL(输入抽象层),向上为基于标准POSIX接口中pthread库的Mini-Thread架构和基于Server/Client的Mini-L…

JSONObject - 用最通俗的讲解,教你玩转 JSON 数据的解析和修改

目录 一、JSONObject 1.1、为什么要使用他? 1.2、应用 1.2.1、依赖 1.2.2、JSON 数据示例 1.2.3、JSON 数据的构建 1.2.4、JSON 数据的解析 一、JSONObject 1.1、为什么要使用他? 在还没有接触过这个东西的时候,一直是通过 ObjectMap…

Spring 核心之 IOC 容器学习二

基于 Annotation 的 IOC 初始化 Annotation 的前世今生 从 Spring2.0 以后的版本中,Spring 也引入了基于注解(Annotation)方式的配置,注解(Annotation)是 JDK1.5 中引入的一个新特性,用于简化 Bean 的配置,可以取代 XML 配置文件…

深度学习记录--归—化输入特征

归化 归化输入(normalizing inputs),对特征值进行一定的处理,可以加速神经网络训练速度 步骤 零均值化 通过x值更新让均值稳定在零附近,即为零均值化 归化方差 适当减小变量方差 解释 归化可以让原本狭长的数据图像变得规整,梯度下降的…

Electron中苹果支付 Apple Pay inAppPurchase 内购支付

正在开发中,开发好了,写一个完整详细的过程,保证无脑集成即可 一、先创建一个App 一般情况下,在你看这篇文章的时候,说明你已经开发的app差不多了。 但是要上架app到Mac App Store,则要在appstoreconnect…

WPF中Image控件Source的多种指定方式

XAML中 1、直接绝对路径直接给Source 2、将图片放到项目里面,设置图片为资源;Source写法为: (1)Source"pack://application:,,,/label里面的Content;component/folder/test.png" (2&…

HBase学习六:LSM树算法

1、简介 HBase是基于LSM树架构实现的,天生适合写多读少的应用场景。 LSM树本质上和B+树一样,是一种磁盘数据的索引结构。但和B+树不同的是,LSM树的索引对写入请求更友好。因为无论是何种写入请求,LSM树都会将写入操作处理为一次顺序写,而HDFS擅长的正是顺序写(且HDFS不…