登录
首页 >  Golang >  Go问答

接收者类型的方法集

来源:stackoverflow

时间:2024-04-11 12:33:35 243浏览 收藏

积累知识,胜过积蓄金银!毕竟在Golang开发的过程中,会遇到各种各样的问题,往往都是一些细节知识点还没有掌握好而导致的,因此基础知识点的积累是很重要的。下面本文《接收者类型的方法集》,就带大家讲解一下知识点,若是你对本文感兴趣,或者是想搞懂其中某个知识点,就请你继续往下看吧~

问题内容

规格说明:

类型的方法集决定了该类型实现的接口以及可以使用该类型的接收器调用的方法。

因此,为了验证这一点,下面是代码:

package main

import "fmt"

// I interf
type I interface {
    hello()
    goodbye()
}

// T type
type T struct {
    name string
}

func (t T) hello() {
    fmt.Println("Hello", t.name)
}

func (t *T) goodbye() {
    fmt.Println("Goodbye", t.name)
}

func main() {
    var t1 T = T{"James"}
    t1.hello()
    t1.goodbye()
}

t1.goodbye() 可以工作,尽管 goodbye() 方法不是 t 类型的方法集的一部分。因为, t1.goodbye() 内部工作方式为 (&t1).goodbye() ,满足以下规则:

如果您有一个 t 并且它不可寻址,则只能调用接收器类型为 t 而不是 *t 的方法。

但是,规范说,方法调用遵循以下规则:

类型的方法集决定了该类型实现的接口以及可以使用该类型的接收器调用的方法。

(&t1).goodbye() 形式调用 t1.goodbye() 是否会破坏方法调用规则?


解决方案


来自规范中的 Calls...

如果 x(的类型)的方法集包含 m 并且参数列表可以分配给 m 的参数列表,则方法调用 x.m() 有效。如果x是可寻址的并且&x的方法集包含m,则x.m()是(&x).m()的简写

  • t1 是可寻址的。
  • &t1的方法集包含goodbye()。
  • t1.goodbye() 是 (&t1).goodbye() 的简写。

好了,本文到此结束,带大家了解了《接收者类型的方法集》,希望本文对你有所帮助!关注golang学习网公众号,给大家分享更多Golang知识!

声明:本文转载于:stackoverflow 如有侵犯,请联系study_golang@163.com删除
相关阅读
更多>
最新阅读
更多>
课程推荐
更多>