``` go
func main(){
dd := []TestA{TestA{}, TestA{}}
ConsolePrint(dd) //这里要报错,类型转换不成功
}
type InterfaceT interface {
Console()
}
type TestA struct {
}
func (t TestA) Console() {
fmt.Println("testA")
}
func ConsolePrint(i []InterfaceT) {
for _, item := range i {
item.Console()
}
}
```
大侠些说下怎么回事吧, 像这种情况通过其它方式怎么处理呢
协变和逆变,上网搜一下就知道了,为了代码的安全性,肯定是不能支持你这么干的,不然早晚出问题。
比如你外面是[]TestA,传入函数的时候支持签名[]InterfaceT,然后你函数里面把切片第三个元素改成TestB类型(which 也是InterfaceT)那外面的那个[]TestA是不是有问题?它第三个元素变成TestB了呀。所以你想要的这种行为是不可能支持的。
#2
更多评论
试了一下把
dd := []TestA{TestA{}, TestA{}}
改成
dd := []InterfaceT{TestA{}, TestA{}}
就可以了,原理我也不太懂,等大佬讲解
#1