golang接口实现调用修改(值接收者指针接收者)场景详解

 更新时间:2023年08月23日 14:05:24   作者:牙小木木  
这篇文章主要为大家介绍了golang接口实现调用修改值接收者指针接收者示例详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪

比如有以下说明:

说明备注
接口比如一个coder的interface,有code和debug方法
方法接收者(实现接口)可能有多个,比如phper,golanger,可能是值接收(对象),也可能是指针接收(对象指针)
调用者为:接口就是接口coder调用
调用者为:方法接收者比如phper,golanger,调用者可能是值调用(对象),或者指针调用(对象指针)

关于调用

调用者为 方法接收者

无论方法接收者(实现接口)是值接收(对象),还是是指针接收(对象指针),都可以用调用者直接调用方法。此时调用者不受是值还是指针的限制。

换句话说:无论接收者是值类型还是指针类型,都可以通过值类型或者指针类型调用。原因是这里有寻址及解引用的隐形操作。

调用者为 接口

先说调用者为接口的意思是:

type Coder interface {
    code()
    debug()
}
func Work(c Coder){
    c.code()
    c.debug()
}
type Golang struct {
}
type PHP struct {
}
func (g *Golang) code(){
    fmt.Println("golang code")
}
func (g *Golang) debug(){
    fmt.Println("golang debug")
}
func (g *PHP) code(){
    fmt.Println("php code")
}
func (g PHP) debug(){
    fmt.Println("php debug")
}
//这里理解为调用者为接口,
var c Coder=&PHP{}
c.debug()
c.code()

这里主要涉及到接口转换,及需要把coder转为phper或者golanger
结论:实现接收者是值类型的接口方法时,可以正常地用值或指针进行接口转换,
但实现接收者是指针类型的方法时,接口转换只能使用指针,不能使用值类型。

原因:

通过值可以找到值对应唯一的指针(无论是使用值还是使用指针,方法集都是一样的)。

但是,实现接收者是指针类型的方法时,接口转换只能使用指针,不能使用值类型。这是因为指针方法期望的是一个可以被取地址的对象,而通过值类型进行接口转换时,你可能会传递一个无法取地址的临时对象,这会导致无法调用指针方法。

关于修改

如果方法的接收者是值类型,无论调用者是对象还是对象指针,修改的都是其副本,调用者本身不会更改。
如果方法接收者是指针类型,修改的就是调用者本身。

当你不需要修改状态且要避免并发问题时,值类型接收者是个不错的选择。
当你需要修改状态、需要在并发环境下操作或者需要减少值拷贝时,指针类型接收者更合适。

选择接收者是值类型还是指针类型取决于多种因素,包括可修改性、并发操作和内存开销。

接收者是值类型的场景:

不需要修改接收者的状态:

如果方法不需要修改接收者的状态,而只是基于其属性进行操作,那么可以使用值类型接收者。这样可以避免意外的副作用。

避免并发问题:

值类型接收者是线程安全的,因为它们在方法内部只操作接收者的副本,不会影响原始数据的状态。这在并发环境中往往更容易管理。

接收者是指针类型的情况:

需要修改接收者的状态:

如果方法需要修改接收者的状态,那么你必须使用指针类型接收者。这样可以在方法内部修改原始数据,而不仅仅是操作副本。

避免值拷贝带来的内存开销:

对于大型的结构体或对象,使用指针类型接收者可以避免在方法调用时进行值的拷贝,减少内存和性能开销。

以上就是golang中的接口实现、调用、修改(值接收者、指针接收者)的详细内容,更多关于golang中的接口实现、调用、修改(值接收者、指针接收者)的资料请关注脚本之家其它相关文章!

相关文章

  • Golang Template实现自定义函数的操作指南

    Golang Template实现自定义函数的操作指南

    这篇文章主要为大家详细介绍了Golang如何利用Template实现自定义函数的操作,文中的示例代码简洁易懂,感兴趣的小伙伴可以跟随小编一起学习一下
    2025-02-02
  • Go语言转化php数组的示例代码

    Go语言转化php数组的示例代码

    这篇文章主要为大家详细介绍了Go语言如何实现转化php数组的相关知识,文中的示例代码讲解详细,对我们深入学习GO语言有一定的帮助,需要的可以参考下
    2023-11-11
  • 关于golang test缓存问题

    关于golang test缓存问题

    这篇文章主要介绍了关于golang test缓存问题,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2022-09-09
  • Go语言区别于其他语言的特性

    Go语言区别于其他语言的特性

    在本文中,今天这篇文章将给大家介绍一下 Go 与其他语言不同的 9 个特性,需要的朋友可以参考下面文章的具体内容
    2021-10-10
  • golang进行简单权限认证的实现

    golang进行简单权限认证的实现

    本文主要介绍了golang简单权限认证的实现,文中通过示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2021-09-09
  • go语言中的Stringer的使用示例详解

    go语言中的Stringer的使用示例详解

    Go 语言中的 Stringer 是一个非常有用的接口,它在标准库的 fmt 包中定义,Stringer 接口允许类型定义它们的字符串表示方式,这在格式化输出时特别有用,这篇文章主要介绍了go语言中的Stringer的使用,需要的朋友可以参考下
    2025-02-02
  • golang实现openssl自签名双向认证的详细步骤

    golang实现openssl自签名双向认证的详细步骤

    这篇文章主要介绍了golang实现openssl自签名双向认证的详细步骤,本文分步骤给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友参考下吧
    2024-03-03
  • go Cobra命令行工具入门教程

    go Cobra命令行工具入门教程

    Cobra是一个用Go语言实现的命令行工具并且现在正在被很多项目使用,例如:Kubernetes、Hugo和Github CLI等,通过使用Cobra,我们可以快速的创建命令行工具,特别适合写测试脚本,各种服务的Admin CLI等,本文重点给大家介绍go Cobra命令行工具,感兴趣的朋友一起看看吧
    2022-06-06
  • gorm整合进go-zero的实现方法

    gorm整合进go-zero的实现方法

    go-zero提供的代码生成器里面,没有提供orm框架操作,但是提供了遍历的缓存操作,所以可以利用gorm当作一个sql语句的生成器,把生成后的sql语句放到go-zero生成的模板中去执行,对gorm整合进go-zero的实现方法感兴趣的朋友一起看看吧
    2022-03-03
  • Golang操作命令行的几种方式总结

    Golang操作命令行的几种方式总结

    这篇文章主要介绍了Golang操作命令行的几种方式总结,文章通过围主题思想展开详细的内容介绍,具有一定的参考价值,需要的小伙伴可以参考一下
    2022-09-09

最新评论