用作接口的复合文字的地址

当用作接口时,复合文字的地址被评估为文字本身。有人可以指出参考规范中处理此问题的部分吗?


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())

}

也在这里。对于将来的参考,是否可以只链接到操场而不在此处包含代码?


繁华开满天机
浏览 160回答 1
1回答

阿波罗的战车

规格:方法集:一个类型可能有一个与之关联的方法集。接口类型的方法集就是它的接口。任何其他类型的方法集T由所有声明为接收者类型的方法组成T。对应指针类型 *T的方法集是所有用receiver *Tor声明T的方法的集合(也就是包含了的方法集T)。因此 的方法集*cncrt包括 的方法集cncrt。由于rx()是cncrt的方法集的元素,因此它也将是 in*cncrt的方法集。这意味着cncrt和*cncrt类型都实现了ntfc接口。如果您有一个指针值 ( *cncrt) 并调用rx()它,则该指针将自动取消引用,该指针将成为该rx()方法的接收者。在您的rtnsNtfca()和rtnsNtfc()函数中,ntfc将自动创建并返回一个接口值。Go 中的接口值表示为 (type;value) 对(更多详细信息:反射定律#接口的表示)。因此,无论rtnsNtfca()与rtnsNtfc()返回一个接口值,但第一个持有类型的动态值*cncrt和后者之一成立类型的动态值cncrt。并且您的第三个方法rtrnsCncrt()返回一个具体类型 ( *cncrt),那里不涉及接口包装。注意:“反过来”规格: 调用:Ifx是可寻址的并且&x的方法集包含m,x.m()是 的简写(&x).m()。这意味着如果你声明rx()了一个指针接收器,并且你有一个类型的变量cncrt(注意:不是指针),rx()如果它是可寻址的,你仍然可以调用它的方法,并且地址将被自动获取并用作收件人。
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Go