首页 > 其他分享 >GO:值接收者和指针接收者的区别

GO:值接收者和指针接收者的区别

时间:2024-12-22 13:33:14浏览次数:6  
标签:number 接收者 Println func M2 GO 指针

GO:值接收者和指针接收者的区别

虽然我们之前提到过,在使用S.F()方式调用方法时,GO对值和指针的限制是宽松的,但是在继承接口这方面,这里是有着严格的区分的。

1. 实现接口的函数接收者全是值,使用值调用

type I interface {
	M()
	M2()
}

type S struct {
	number int64
}

func (s S) M() {
	fmt.Println(s.number)
}

func (s S) M2() {
	fmt.Println(s.number)
}

func F(i I) {
	i.M()
	i.M2()
}

func main() {
	s := S{number: 64}
	F(s)
}

这里所有的M()函数接受者都是值,因此F(s)是没问题的

2. 实现接口的函数接收者部分是值,使用值调用

修改上面的函数定义:

func (s *S) M2() {
	fmt.Println(s.number)
}

这里的M2()接收者改成了指针,F(s)就不能调用了,因为S的值现在不算实现了I接口。

3. 实现接口的函数接收者全是指针,使用指针调用

这种情况显然是成立的,不贴代码了。

4. 实现接口的函数接收者部分是指针,使用指针调用

type I interface {
	M()
	M2()
}

type S struct {
	number int64
}

func (s S) M() {
	fmt.Println(s.number)
}

func (s *S) M2() {
	fmt.Println(s.number)
}

func F(i I) {
	i.M()
	i.M2()
}

func main() {
	s := &S{number: 64}
	F(s)
}

这里也是能正常调用的。

5. 实现接口的函数接收者全是值,使用指针调用

type I interface {
	M()
	M2()
}

type S struct {
	number int64
}

func (s S) M() {
	fmt.Println(s.number)
}

func (s S) M2() {
	fmt.Println(s.number)
}

func F(i I) {
	i.M()
	i.M2()
}

func main() {
	s := &S{number: 64}
	F(s)
}

这里依然能够正常调用。


综上所述,在没有特殊要求的情况下,统一使用指针作为接收者是最好的选择。

标签:number,接收者,Println,func,M2,GO,指针
From: https://www.cnblogs.com/smartljy/p/18622026

相关文章

  • 安装MongoDB,环境配置
    官网下载地址:MongoDBShellDownload|MongoDB选择版本安装下载完成双击打开点击mongodb-windows-x86_64-8.0.0-signed选择安装地址检查安装地址安装成功二.配置MongoDB数据库环境1.找到安装好MongoDB的bin路径复制bin路径打开此电脑->打开高级系统设置->......
  • GO对值和指针的自动转换
    GO对值和指针的自动转换GO当中,在使用S.F()这样的方式调用方法时,GO会自动执行值和指针之间的转换,没有C/C++当中那么严格的区分内容以下是整理后的博客内容,适合用来讲解Go和C++在指针与方法调用上的区别:Go和C++在指针和方法调用方面的区别在Go语言和C++中,指针的使......
  • Google Kickstart2021 Round C Problem A
    数位DP传送思路简单的数位DP,假定每一位的字符前面是最大的字符,对于每一位的字符,小于当前字符的数量是(s[i]-'a'),此时如果这样选择,那么后面的每一个到字符串中间的字符都可以任选m个,设第i个到中间字符的数量是y,所以此时可以构成的满足条件的字符是\((s[i]-'a')*m^y\)但是我们......
  • 2024-12-22:矩阵中的最大得分。用go语言,给定一个由正整数构成的 m x n 矩阵 grid,你可以
    2024-12-22:矩阵中的最大得分。用go语言,给定一个由正整数构成的mxn矩阵grid,你可以从任意单元格开始,移动到正下方或正右侧的任一单元格(不要求相邻)。在从值为c1的单元格移动到值为c2的单元格时,得分计算为c2-c1。你的目标是至少移动一次,并找到能够获得的最大总得......
  • Golang中的Map是怎么遍历的
    在Golang中,遍历map的常见方法是使用for...range循环。map是无序的键值对集合,因此遍历map时,每次迭代访问的键值对顺序可能不同。以下是一个遍历map的示例:packagemainimport"fmt"funcmain(){//创建一个mapmyMap:=map[string]int{"ap......
  • Go语言中context 结构原理, 使用场景和用途
    Go语言中context结构原理在Go语言中,context是一个用于在API边界之间传递请求范围的值、取消信号、截止时间等信息的机制。它主要用于处理跨API边界的请求取消、超时控制以及传递请求范围内的共享数据。context的设计目标是为了解决在并发编程中,特别是Goroutines之间相互协作时......
  • 使用canvas画一个github的LOGO图案
    使用HTML5<canvas>元素来绘制GitHub的LOGO需要一些细致的工作,因为GitHub的LOGO并不是一个简单的几何图形。但是,为了简化,我们可以尝试绘制一个简化的版本,比如一个类似于GitHubLOGO的八边形图案。以下是一个简化的示例,展示如何使用<canvas>来绘制一个类似GitHubL......
  • 路径规划之启发式算法之二十一:狼群算法(Wolf Pack Algorithm,WPA)
            狼群算法(WolfPackAlgorithm,WPA)是一种模拟狼群捕食行为及其猎物分配方式的群体智能优化算法。它由吴虎胜等人在2013年提出,算法采用了基于人工狼主体的自下而上的设计方法和基于职责分工的协作式搜索路径结构。它通过抽象狼群搜索、围攻以及更新换代的三种行为......
  • Golang学习笔记_13——数组
    Golang学习笔记_10——SwitchGolang学习笔记_11——指针Golang学习笔记_12——结构体文章目录数组1.定义2.访问和修改3.多维数组4.计算数组长度5.数组作为函数参数6.遍历7.数组的内存表示源码数组Go语言中的数组是一种具有固定长度、相同类型元素的集......
  • Golang学习笔记_14——切片
    Golang学习笔记_11——指针Golang学习笔记_12——结构体Golang学习笔记_13——数组文章目录切片1.定义2.创建3.基本操作4.动态性5.子切片6.数组和切片7.注意8.高级用法源码切片Go语言中的切片(slice)是一种非常强大且灵活的数据结构,它基于数组,但提供了......