首页 > 其他分享 >Go 语言中值接收者和指针接收者方法调用的自动转换规则详解

Go 语言中值接收者和指针接收者方法调用的自动转换规则详解

时间:2024-06-17 10:11:40浏览次数:9  
标签:调用 接收者 ShowB func Go 转换规则 指针

在 Go 语言中,方法的调用规则对于值接收者和指针接收者有一些特别的行为,这使得代码变得更加简洁和易用。我们来详细解释一下“方法值调用规则”和“方法表达式调用规则”,以及它们如何影响代码的行为。

方法值调用(Method Value Call)

在 Go 中,方法调用的语法是 receiver.method(). 当一个方法具有接收者时,Go 允许我们在值接收者和指针接收者之间进行一定程度的自动转换。这些转换规则使得方法调用更加灵活。

自动获取地址

当你调用一个接收者为指针的方法时,如果你持有的是一个值,Go 会自动获取这个值的地址并传递给方法。反过来,如果你调用一个接收者为值的方法时,持有的是指针,Go 会自动解引用指针并传递给方法。

举例解释

假设我们有以下结构体和方法:

type Example struct {
    Value int
}

func (e Example) ValueMethod() {
    fmt.Println("ValueMethod called on", e.Value)
}

func (e *Example) PointerMethod() {
    fmt.Println("PointerMethod called on", e.Value)
}

值接收者方法调用

var ex Example
ex.ValueMethod()   // 直接调用,传递值
(&ex).ValueMethod() // 自动解引用 ex,传递值

指针接收者方法调用

var ex Example
ex.PointerMethod()  // 自动获取 ex 的地址,传递指针
(&ex).PointerMethod() // 直接传递指针

在代码中的应用

type People struct{}

func (p *People) ShowA() {
    fmt.Println("showA")
    p.ShowB()
}

func (p *People) ShowB() {
    fmt.Println("showB")
}

type Teacher struct {
    People
}

func (t *Teacher) ShowB() {
    fmt.Println("teacher showB")
}

func main() {
    t := Teacher{}
    t.ShowB()
}
  • t := Teacher{} 创建了一个 Teacher 类型的值。
  • t.ShowB() 调用 TeacherShowB() 方法,尽管 ShowB 的接收者是 *Teacher 类型的指针,Go 自动获取 t 的地址并传递给方法,因此调用的是 (&t).ShowB()
type People struct{}

func (p People) ShowA() {
    fmt.Println("showA")
    p.ShowB()
}

func (p People) ShowB() {
    fmt.Println("showB")
}

type Teacher struct {
    People
}

func (t *Teacher) ShowB() {
    fmt.Println("teacher showB")
}

func main() {
    t := &Teacher{}
    t.ShowB()
}
  • 这样也能正常输出

为什么可以这样?

这是因为 Go 编译器知道 ShowB 方法需要一个指针接收者,并且在 t 是一个值时,它会自动获取 t 的地址以符合方法的签名。这使得方法调用更加直观,无需显式地获取地址。

总结

  • 值接收者方法:可以使用值或者指针来调用。
  • 指针接收者方法:可以使用指针或者值来调用,Go 会自动获取地址。

这种自动转换规则使得方法调用变得更加简洁,不需要显式地在值和指针之间转换,从而减少了代码的复杂性和易错性。

标签:调用,接收者,ShowB,func,Go,转换规则,指针
From: https://www.cnblogs.com/crazytata/p/18251823

相关文章

  • Mongodb UPDATE, 使用$position指定向数组中插入新元素的位置
    学习mongodb,体会mongodb的每一个使用细节,欢迎阅读威赞的文章。这是威赞发布的第72篇mongodb技术文章,欢迎浏览本专栏威赞发布的其他文章。如果您认为我的文章对您有帮助或者解决您的问题,欢迎在文章下面点个赞,或者关注威赞。谢谢。本篇文章,我们聊聊在mongodb数组更新的操作符$po......
  • PHP 程序员转 Go 语言的经历分享
    大家好,我是码农先森。之前有朋友让我分享从PHP转Go的经历,这次它来了。我主要从模仿、进阶、应用这三个方面来描述转Go的经历及心得。模仿是良好的开端,进阶是艰难的成长,应用是认知的提升。希望我的经历对大家能有所启发。模仿著名艺术家毕加索说过「模仿是人类一切学习的......
  • solidity签名机制和go联合调试学习
    1.solidity实现:1.1.引入eip712合约://SPDX-License-Identifier:MITpragmasolidity^0.8.0;/***@devhttps://eips.ethereum.org/EIPS/eip-712[EIP712]isastandardforhashingandsigningoftypedstructureddata.**TheencodingspecifiedintheEIPis......
  • Google Chrome Proxy error All In One
    GoogleChromeProxyerrorAllInOnemacOSWi-FiproxieswebproxyHTTPsecuritywebproxyHTTPSsocksproxydemos(......
  • c# 检测密码强度,评分规则仿google
    参考delphi的代码更改为C#Delphi检测密码强度规则(仿google)仿google评分规则一、密码长度:5分:小于等于4个字符10分:5到7字符25分:大于等于8个字符二、字母:0分:没有字母10分:全都是小(大)写字母20分:大小写混合字母三、数字:0分:没有数字10......
  • typora通过picgo配置图床
    满足大部分需求:gitee图床教程链接:https://zhuanlan.zhihu.com/p/567668223?utm_id=0但gitee有1M的图片限制,若需要高清图片,可配置腾讯云cos图床高清图片需求:腾讯云cos图床教程链接:https://cloud.tencent.com/developer/article/1834573两者优缺点对比:gitee腾讯云cos......
  • 【四种语言一网打尽(C\C++\Python\Golang)】L1-012 计算指数
    L1-012计算指数真的没骗你,这道才是简单题——对任意给定的不超过10的正整数n,要求你输出2^n。不难吧?输入格式:输入在一行中给出一个不超过10的正整数n。输出格式:在一行中按照格式2^n=计算结果输出2^n的值。输入样例:5输出样例:2^5=32C语言参考......
  • 【四种语言一网打尽(C\C++\Python\Golang)】L1-009 N个数求和
    L1-009N个数求和本题的要求很简单,就是求N个数字的和。麻烦的是,这些数字是以有理数分子/分母的形式给出的,你输出的和也必须是有理数的形式。输入格式:输入第一行给出一个正整数N(≤100)。随后一行按格式a1/b1a2/b2…给出N个有理数。题目保证所有分子和分母都在长整型范围......
  • Go Goroutine 究竟可以开多少?(详细介绍)
    GoGoroutine究竟可以开多少?Go语言因其高效的并发处理能力而备受欢迎,而Goroutine则是Go语言实现并发编程的核心。Goroutine比传统的线程更加轻量,允许开发者轻松地处理大量并发任务。那么,Go语言中的Goroutine究竟可以开多少呢?在回答这个问题之前,我们需要先了解两个关键问题......
  • 如何从0到1实现一个go语言代码项目
    创建一个Go语言项目是一个逐步的过程,这里我将为你提供一个简单的项目示例,包括一些基础步骤来帮助你从0开始实现一个Go语言项目。步骤1:安装Go语言环境首先,你需要在你的计算机上安装Go语言环境。你可以从[Go官网](https://golang.org/dl/)下载适合你操作系统的安装包。......