为了账号安全,请及时绑定邮箱和手机立即绑定

将“func返回指向结构的指针”分配给“func返回指向接口的指针”类型的var

将“func返回指向结构的指针”分配给“func返回指向接口的指针”类型的var

Go
一只名叫tom的猫 2022-05-18 14:46:38
我有两个函数返回指向符合同一接口的两个单独结构的指针。如何将功能放在同一张地图中?我想出了创建包装函数(getFooer在示例中)来检查类型。有没有更好的办法?使类型检查getFooer函数中的类型转换但不检查注释掉行中的类型转换的规则是什么main?package mainimport (    "fmt")type Fooer interface {    Foo()}type A struct {}func (a *A) Foo() {}var a A = A{}func getA() (*A) {    return &a}func getFooer() (Fooer) {    return getA()}func main() {    var f func() (Fooer)    // f = getA    // /tmp/foo.go:29:7: cannot use getA (type func() *A) as type func() Fooer in assignment    f = getFooer    fmt.Println(f)}
查看完整描述

1 回答

?
天涯尽头无女友

TA贡献1831条经验 获得超9个赞

如何将功能放在同一张地图中?

你不能,它们有不同的类型。

我想出了创建包装函数(示例中为 getFooer)来检查类型。有没有更好的办法?

基本上:不。您可以将例如 getA 的签名修改为,但如果您需要 A ,则getA() Fooer需要类型断言。*A

使类型检查 getFooer 函数中的类型转换,但不检查 main 中注释掉的行中的类型转换的规则是什么?

死简单:一个函数getA() *Ahase类型func() *A和这个类型不同func() Fooer(没有协方差)。Functin 类型必须在字面上匹配。您可以将 a*A作为 a返回,Fooer因为您可以将 a 分配给*A类型为 的变量Fooer。getA 产生 a*A并将其*A分配给其返回值为getFooerFooer


查看完整回答
反对 回复 2022-05-18
  • 1 回答
  • 0 关注
  • 92 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信