我想了解Go的类型转换规则。假设我们有以下接口:为什么我无法在Go中替换另一种类型的切片?
type woofer interface {
woof()
}
type runner interface {
run()
}
type woofRunner interface {
woofer
runner
}
,并满足我们有一个dog
类型的接口:
type dog struct{}
func (*dog) run() {}
func (*dog) woof() {}
这两个功能使用的接口:
func allWoof(ws []woofer) {}
func oneWoof(w woofer) {}
要使用这些方法我可以写下:
dogs := make([]woofRunner, 10)
oneWoof(dogs[0])
allWoof(dogs)
第一个功能oneWoof()
按预期工作;一个*dog
实现所有oneWoof
需求,这是一个woof
函数。
不过,对于第二个功能allWoof
,围棋将无法编译尝试调用,报告如下:
不能用狗(型[] woofRunner)类型[]低音单元在争论allWoof
使用类型转换也是不可能的;写[]woofer(dogs)
也将失败:
不能将狗(型[] woofRunner)键入[]低音单元
的[]woofRunner
每一个成员都拥有所有必要的功能,以满足[]woofer
,所以这是为什么禁止转换?
(我不知道这是否是相同的情况下,在围棋FAQ并在堆栈溢出,使人们问转换类型T
到interface{}
各种问题解释切片/阵列中的每个指针指向。我知道一个解决方案是在循环和并转换:即直接转换为另一种类型使用这些指针应为同样的原因,经过dog[0]
为“oneWoof`是可能的)
注1可能项目逐一。我的问题是为什么这是必要的,是否有更好的解决方案。
注2:就Assignability规则:
甲值x可分配给类型的T A变量[时] T是一个接口类型以及x实现T.
难道我们不能说切片/数组的类型是否可以分配给另一种类型,那么这些类型的数组也可以赋值?
https://golang.org/ref/spec#Assignability因此,赋值不符合语言标准可分配性规则。 – zerkms
原因:因为这就是类型转换的工作原理。不,没有更好的解决方案。 – Flimzy
请参阅https://golang.org/doc/faq#convert_slice_of_interface。经验法则:检查有效围棋,常见问题解答,围棋之旅和语言规范。答案就在那里。 – Volker