用作接口

时间:2015-08-03 14:36:23

标签: go 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。对于将来的参考,是否可以直接链接到操场而不包含代码?

1 个答案:

答案 0 :(得分:2)

Spec: Method sets:

  

类型可能具有与之关联的方法集interface type的方法集是其接口。任何其他类型T的方法集由声明为接收器类型T的所有methods组成。相应pointer type *T的方法集是使用receiver *TT声明的所有方法的集合(也就是说,它还包含{{1}的方法集}})。

因此T的方法集包含*cncrt方法集。由于cncrtrx()方法集的元素,因此它也将位于cncrt的方法集中。这意味着*cncrtcncrt类型都实现了*cncrt接口。

如果你有一个指针值(ntfc)并在其上调用*cncrt,则指针将自动被解引用,这将是rx()方法的接收者。

rx()rtnsNtfca()函数中,将自动创建并返回rtnsNtfc()的接口值。 Go中的接口值表示为(type; value)对(更多详细信息:The Laws of Reflection #The representation of an interface)。因此,ntfcrtnsNtfca()都会返回一个接口值,但第一个包含rtnsNtfc()类型的动态值,后一个包含类型*cncrt的动态值。< / p>

你的第三个方法cncrt返回一个具体的类型(rtrnsCncrt()),那里没有涉及的界面包装。

注意:“反过来”

Spec: Calls:

  

如果*cncrtaddressablex的方法集包含&x,则mx.m()的简写。

这意味着如果你声明(&x).m()有一个指针接收器,并且你有一个rx()类型的变量(注意:不是指针),你仍然可以调用cncrt它是可寻址的方法,地址将被自动采用并用作接收器。