go 从哪个版本开始支持用结构体对象调用接收指针类型的方法的?

作者站长头像
站长
· 阅读数 8
package main

import "fmt"

type Printer interface {
    print()
}

type Foo struct {
    i int
}

func (f *Foo) print() {
    f.i = 2
    fmt.Println(f)
}

func main() {
    f1 := Foo{}
    var f2 any = f1
    if _, ok := f2.(Printer); ok {
        fmt.Println("OK")
    }
    f1.print()
    fmt.Println(f1)
}

编译输出结果:

&{2}{2}

这一段代码可以在 go 1.20 版本下通过编译。我参照 https://draveness.me/golang/docs/part2-foundation/ch04-basic/... 的理解,方法定义如果接收类型为指针那么只能接收指针调用。那么从什么哪个版本开始 go 支持这种方法调用的转换呢?

回复
1个回答
avatar
test
2024-07-04

哪个版本都是可以编译通过的。

不可以编译通过的指的是直接用字面量那种形式:

Foo{}.print()     // error!
(&Foo{}).print()  // ok

你这里不是字面量,而是通过中间变量了,golang 自己会隐式转换的。

P.S. 这跟可寻址性(Addressable)有关,感兴趣可以自己去了解。

回复
likes
适合作为回答的
  • 经过验证的有效解决办法
  • 自己的经验指引,对解决问题有帮助
  • 遵循 Markdown 语法排版,代码语义正确
不该作为回答的
  • 询问内容细节或回复楼层
  • 与题目无关的内容
  • “赞”“顶”“同问”“看手册”“解决了没”等毫无意义的内容