为什么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{}
可以重命名为Any
任何内容(slices
,map
,func
),而不仅仅是简单类型
第二个问题是:有没有办法让它成为可能?
答案 0 :(得分:5)
第一个约为type conversion和 type identity ,您有一套规则。
请参阅" Why can I type alias functions and use them without casting?"
type Any interface{}
是一个命名类型interface{}
是未命名的类型他们的身份不同,您无法使用func(interface[})
代替func(Any)
。
第二个问题由golang faq
涵盖[]T
转换为[]interface{}
吗?不直接,因为他们在内存中没有相同的表示 有必要将元素分别复制到目标切片。此示例将int切片转换为接口{}的切片:
t := []int{1, 2, 3, 4}
s := make([]interface{}, len(t))
for i, v := range t {
s[i] = v
}
参见" what is the meaning of interface{}
in golang?"有关内存表示的更多信息: