将类型转换接口指针键入接口指针

时间:2019-09-13 14:54:47

标签: pointers go interface casting

我正在尝试将接口指针(*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?
}

那么,我该如何解决呢?

1 个答案:

答案 0 :(得分:1)

您不能投射它,只能复制它,然后传递副本的地址。

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

这与将B的指针传递给A并不相同,这是有原因的。如果f为指针分配了一个值(类型为*A),则不能保证新值将是实现B的接口。当f返回时,调用者可能会被指向类型为B的接口的指针所困,该接口的值未实现B

以上内容将满足f的合同,但不会修改传递给b的{​​{1}}。你根本做不到。

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