登录
首页 >  Golang >  Go问答

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

来源:SegmentFault

时间:2023-05-06 08:11:22 469浏览 收藏

从现在开始,我们要努力学习啦!今天我给大家带来《go 从哪个版本开始支持用结构体对象调用接收指针类型的方法的?》,感兴趣的朋友请继续看下去吧!下文中的内容我们主要会涉及到等等知识点,如果在阅读本文过程中有遇到不清楚的地方,欢迎留言呀!我们一起讨论,一起学习!

问题内容

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 支持这种方法调用的转换呢?

正确答案

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

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

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

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

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

文中关于mysql的知识介绍,希望对你的学习有所帮助!若是受益匪浅,那就动动鼠标收藏这篇《go 从哪个版本开始支持用结构体对象调用接收指针类型的方法的?》文章吧,也可关注golang学习网公众号了解相关技术文章。

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