当用作接口(interface)时,组合文字的地址将作为文字本身进行评估。有人可以指出ref spec中与此相关的部分吗?

package main
import "fmt"

type ntfc interface {
    rx() int
}

type cncrt struct {
    x int
}

func (c cncrt) rx() int{
    return c.x
}

func rtrnsNtfca() ntfc {
    return &cncrt{3}
}

func rtrnsNtfc() ntfc {
    return cncrt{3}
}

func rtrnsCncrt() *cncrt {
    return &cncrt{3}
}

func main() {
    fmt.Println(rtrnsNtfca().rx())
    fmt.Println(rtrnsNtfc().rx())
    fmt.Println(rtrnsCncrt().rx())
}

也是here。对于将来的引用,仅链接到游乐场而不包含此处的代码是否可以接受?

最佳答案

Spec: Method sets:



因此,*cncrt的方法集包括cncrt的方法集。由于rx()cncrt的方法集中的元素,因此它也将在*cncrt的方法集中。这意味着cncrt*cncrt类型都实现ntfc接口(interface)。

如果您有一个指针值(*cncrt)并在其上调用rx(),则该指针将自动取消引用,该指针将成为rx()方法的接收者。

在您的rtnsNtfca()rtnsNtfc()函数中,将自动创建并返回ntfc的接口(interface)值。 Go中的接口(interface)值表示为(类型;值)对(更多详细信息:The Laws of Reflection #The representation of an interface)。因此rtnsNtfca()rtnsNtfc()都返回一个接口(interface)值,但是第一个保存一个类型为*cncrt的动态值,而第二个保存一个类型为cncrt的动态值。

您的第三个方法rtrnsCncrt()返回一个具体类型(*cncrt),其中不涉及任何接口(interface)包装。

注意:“相反”

Spec: Calls:



这意味着,如果您已声明rx()具有指针接收器,并且有一个cncrt类型的变量(注意:不是指针),那么如果它是可寻址的,您仍然可以在其上调用rx()方法,并且该地址将自动被获取。并用作接收器。

关于go - 用作接口(interface)的复合文字的地址,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/31790113/

10-12 01:37