【问题标题】:Type casting interface pointer to interface pointer [duplicate]类型转换接口指针到接口指针[重复]
【发布时间】:2020-01-15 11:11:57
【问题描述】:

我正在尝试将接口指针(*B)转换为其他接口指针(*A)。 AB 的“父级”,所以 B 具有 A 的所有功能。

我在 google 中搜索并找到了“类型断言”,但在这种情况下我无法做到。

我试过了: f(b.(A)) f(b.(*A)) f((*b).(A)) f(&(*b).(A))

但唯一有效的是:

tmp := (*b).(A)
f(&tmp)

但是它复制了b并且没有优化。

type A interface {
    foo()
}

type B interface {
    A
    bar()
}

func f(a *A) {
    (*a).foo()
}

func g(b *B) {
    (*b).bar()
    f(b) // How to cast this?
}

那么,我该如何解决呢?

【问题讨论】:

    标签: pointers go interface casting


    【解决方案1】:

    不能投,只能拷贝,然后传拷贝的地址。

    func g(b *B) {
        (*b).bar()
        x:=*b
        f(&x)
    }
    

    这与将指向B 的指针传递为A 不同,这是有原因的。如果f 为指针赋值(类型为*A),则不能保证新值将是实现B 的接口。当f 返回时,调用者可能会被指向B 类型接口的指针卡住,该接口的值未实现B

    以上将满足f的合约,但不会修改传递给gb。你根本做不到。

    您确定需要指向接口的指针吗?

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2015-01-26
      • 2014-10-13
      • 2014-08-16
      • 1970-01-01
      • 1970-01-01
      • 2016-08-01
      • 1970-01-01
      相关资源
      最近更新 更多