Go方法 为什么推荐 使用指针类型的接收者
2023-06-13 09:13:13 时间
值接收者和指针接收者的区别
首先,我们定义如下结构体:
package main
import "fmt"
// 值接收者与指针接收者的区别
type sInterface interface {
info()
debug()
}
type Str struct {
lg string
}
func (s Str) info() {
fmt.Println("info:lg value is", s.lg)
}
func (s *Str) debug() {
fmt.Println("debug:lg value is", s.lg)
}
func main() {
s := Str{"go"}
s.info()
s.debug()
// output
//info:lg value is go
//debug:lg value is go
}
- 在第7行,定义一个接口并声明其中的两个方法。
- 在第12行,定义一个结构体。
- 在第16行和第20行,实现接口中的两个方法。接收者一个是值类型,接收者一个指针类型。
- 在第25行,创建一个值类型结构体。
- 在第26行和第27行,调用结构体中的方法。
通过上面的示例,可以看出结构体的实例是一个值类型,在接收者是指针的方法中,依然可以访问到该值。这是因为实现了接收者是值类型的方法,相当于自动实现了接收者是指针类型的方法。反之,实现了接收者是指针类型的方法,不会自动实现接收者是值类型的方法。
换句话说,在实现了info()方法,默认就实现了debug()方法。反之,实现了debug()方法,不会自动实现info()方法。
接收者是值类型好,还是指针类型好
首先要知道指针类型的接收者,有如下两个优点:
- 接收者是指针类型,可以修改原接收者的值。
- 接收者是指针类型,避免了每次调用方法时复制该值,减少了内存的消耗。对于大型结构体,这样更加高效。
方法的接收者使用值类型还是指针类型,并不是由是否修改接收者的值决定的,应该是由接收者的类型决定。方法的接收者如果是原始类型,推荐使用值类型。方法的接收者如果是非原始类型,推荐使用指针类型。
这里的原始类型可以理解为Go语言内置的原始类型,如数值类型、字符串类型、切片等等。非原始类型可以理解为自定义的接收者。
相关文章
- 【愚公系列】2022年08月 Go教学课程 033-结构体方法重写、方法值、方法表达式
- Go 编程 | 连载 17 - 结构体方法
- 「Go工具箱」go语言csrf库的使用方式和实现原理
- Go——方法和接口
- 「Go工具箱」一个对语义化版本进行解析、比较的库:go-version
- GO语言开篇-Go语言急速入门(基础知识点)| 青训营笔记
- Go语言——方法
- Go-包管理-go mod(一)
- Go-数据库操作(四)
- Go语言go mod包依赖管理工具使用详解
- Go-连接Redis-学习go-redis包详解编程语言
- Go语言依赖管理
- 在 Go 中如何转储一个方法的 GOSSAFUNC 图
- MySQL中使用Go语言的好处(mysql中go什么)
- 使用Go语言实现Redis数据库(用go实现redis)
- 请求简单而快速用Go编写的Redis请求测试(用go写的redis)
- Go语言链接Oracle数据库的实践记录(go 链接oracle)
- Go语言搭建Oracle数据库快速连接方法(go语言连接oracle)
- ODBC数据驱动程序连接Oracle数据库Go语言之旅(go使用oracle)
- 快跟上趋势,GO DB ORACLE(go db oracle)
- EasyGoAdmin_GF_EleVue 版 v1.0.0 发布,一款 Go 的前后端分离敏捷开发框架
- 使用go和python递归删除.dsstore文件的方法