【问题标题】:Why reference type can be assigned to not satisfied interface [golang]为什么可以将引用类型分配给不满意的接口 [golang]
【发布时间】:2016-09-15 11:46:31
【问题描述】:

我发现值类型和引用类型之间的接口可满足性令人困惑。我仍然无法弄清楚它在 golang 中是如何工作的。考虑这个程序:

type Counter1 int
type Counter2 int

func (c Counter1) String() string {

}

func (c *Counter2) String() string {

}

func main() {
    var c1 Counter1
    var c2 Counter2
    var i1 fmt.Stringer = &c1 // assignment 1
    var i2 fmt.Stringer = c2 // assignment 2
}

但是作业 1 有效,但作业 2 无效。我预计它们都不起作用:类型 Counter1 满足 fmt.Stringer 但类型 *Counter1 不满足。所以 &c1 不应该分配给 i1;类型 Counter2 不满足 fmt.Stringer 但类型 *Counter2 满足,因此 c2 不应分配给 i2 并且实际上它不能。这个测试程序的结果对我来说没有意义。我认为它可能是某种语法糖,go 编译器会自动在引用类型和值类型之间进行转换。然而下面的一段测试代码让我更加困惑:

type Test interface {
    f()
    g()
}

func (c Counter1) f() {
}

func (c *Counter1) g() {
}

func receiveTest(t Test) {
}

func main() {
    ......
    var c3 Counter1
    var p3 Test = &c3 // works
    receiveTest(&c3) // works
    receiveTest(c3) // doesn't work
}

*Counter1 类型和 Counter1 类型都不满足接口 Test。但是第一个和第二个任务仍然有效。这对我来说没有意义。

【问题讨论】:

    标签: go


    【解决方案1】:

    在 Go 中,选择器表达式 (x.f) 表示值 x(或有时 *x)的字段或方法 f

    基本上,在 Go 中,如果你在方法上有一个指针接收器,你不必写 &object.method(),但你可以写 object.method()

    https://play.golang.org/p/nh8X-vwdfr

    https://play.golang.org/p/1uKwZw6E-J

    因为接口在 Go 中是隐式的,只要对象本身不是指针,那么满足接口的方法是否有指针接收器都无所谓,它们仍然会被用来满足它。

    因此,在您的示例中,Counter1 结构可以同时调用 f()g() 方法,但 *Counter1 只能调用 g() 方法。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2017-01-26
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-06-11
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多