我正在尝试将接口指针(*B
)转换为其他接口指针(*A
)。 A
是B
的“父”,因此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?
}
那么,我该如何解决呢?
答案 0 :(得分:1)
您不能投射它,只能复制它,然后传递副本的地址。
func g(b *B) {
(*b).bar()
x:=*b
f(&x)
}
这与将B
的指针传递给A
并不相同,这是有原因的。如果f
为指针分配了一个值(类型为*A
),则不能保证新值将是实现B
的接口。当f
返回时,调用者可能会被指向类型为B
的接口的指针所困,该接口的值未实现B
。
以上内容将满足f
的合同,但不会修改传递给b
的{{1}}。你根本做不到。
您确定需要接口的指针吗?