关于Go的selector的疑惑

18328048335 · 2022-07-11 17:38:42 · 1499 次点击 · 大约8小时之前 开始浏览    置顶
这是一个创建于 2022-07-11 17:38:42 的主题,其中的信息可能已经有所发展或是发生改变。

type A struct {
    r int
}

func (a A) FuncA() {}

type B A

type C *A

func main() {
    var b B
    var a A
    var c C
    a.FuncA()   //legal
    b.FuncA()   //illegal
    c.FuncA()   //illegal
    (*c).FuncA()    //legal
    fmt.Println(b.r)    //legal
    fmt.Println(c.r)    //legal
}

为什么b.FuncA() 和 c.FuncA() 不合法,而(*c).FuncA(),b.r和c.r合法呢?


有疑问加站长微信联系(非本文作者)

入群交流(和以上内容无关):加入Go大咖交流群,或添加微信:liuxiaoyan-s 备注:入群;或加QQ群:692541889

1499 次点击  
加入收藏 微博
2 回复  |  直到 2022-07-13 20:02:05
learningboy
learningboy · #1 · 3年之前

我个人理解,仅供参考:

  1. type B A 定义的是一个新类型,但是 B 和 A 的底层类型是一样的(这部分参考圣经),即它们都是拥有 r 这个成员的结构体,因此 b.r 和 c.r 合法
  2. b 和 c 无法调用 FuncA() 是因为它们都是新类型并且没有绑定该方法
  3. 当添加以下代码 b = *c ,ide 提示 type A 类型无法赋值给 type B,所以此时 *c 可以调用方法,至于为什么 *c 是 type A 类型,这点我也不太清楚。
Martinlone
Martinlone · #2 · 3年之前

底层类型和类型相同是两码事,1.18版本之后 带上~符号后,在接口中,实例化的时候,才能出现“底层类型相同所以类型相同“的情况。

添加一条新回复 (您需要 登录 后才能回复 没有账号 ?)
  • 请尽量让自己的回复能够对别人有帮助
  • 支持 Markdown 格式, **粗体**、~~删除线~~、`单行代码`
  • 支持 @ 本站用户;支持表情(输入 : 提示),见 Emoji cheat sheet
  • 图片支持拖拽、截图粘贴等方式上传