指针接收器方法不会被调用保存值的接口变量[关闭]

问题描述 投票:0回答:1
type User struct {
    name string
    age  int
}

func (u *User) String() string {
    return fmt.Sprintf("name = %s, age = %d", u.name, u.age)
}

func main() {

    u1 := User{
        name: "old",
        age:  12,
    }
    fmt.Println(u1)
}

在上面的代码中

fmt.Println
的接收器类型为:any(空接口)。

假设:

指针接收器方法不能在值持有接口上调用,因为方法内部所做的任何更改都不会反映在原始结构中,而只会反映在接口持有的副本上。

但是这段代码可以正常工作,没有任何编译/运行时错误,结果如下。

结果:

{old 12}

看来fmt根本没有调用String方法。 这是预期的行为吗?

go struct methods
1个回答
2
投票

您的指针 String 方法未被调用。这是预期的行为,由于您给出的原因,无法对值调用指针方法。

{old 12}
是结构体的默认输出。请参阅fmt 打印...

struct:             {field0 field1 ...}

也许令人困惑,

fmt.Println(u1.String())
会起作用。这是因为为了方便起见,Go 已经悄悄地将其更改为
fmt.Println(&u1.String())
。来自有效的 Go:方法、指针与值...

不过,有一个方便的例外。当值是可寻址的时,语言会通过自动插入地址运算符来处理对值调用指针方法的常见情况。

© www.soinside.com 2019 - 2024. All rights reserved.