【发布时间】:2014-12-05 06:38:16
【问题描述】:
为什么 Go 不会自动转换:
package main
import "fmt"
type Any interface{} // Any is an empty interface
type X func(x Any) // X is a function that receives Any
func Y(x X) { // Y is a function that receives X
x(1)
}
func test(v interface{}) { // test is not considered equal to X
fmt.Println("called",v)
}
func main() {
Y(test) // error: cannot use test (type func(interface {})) as type X in argument to Y
}
还有这个:
package main
import "fmt"
type Any interface{}
func X2(a Any) {
X(a)
}
func Y2(a interface{}) {
X2(a) // this is OK
}
func X(a ...Any) {
fmt.Println(a)
}
func Y(a ...interface{}) { // but this one not ok
X(a...) // error: cannot use a (type []interface {}) as type []Any in argument to X
}
func main() {
v := []int{1,2,3}
X(v)
Y(v)
}
我真的希望 interface{} 可以在任何东西(slices、map、func)上重命名为 Any,而不仅仅是简单的类型
第二个问题是:有没有办法让它成为可能?
【问题讨论】:
-
namedunnamed 之间缺少隐式转换可能在这里感觉很不方便。这确实意味着,如果你将文件大小和标志都传递为
int64s,你可以声明type Flags uint64,这样如果你不小心交换了它们,类型系统就会捕捉到。
标签: interface go type-conversion