Go界面中的设计决策{}

时间:2014-12-05 06:38:17

标签: interface go type-conversion

为什么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任何内容(slicesmapfunc),而不仅仅是简单类型

第二个问题是:有没有办法让它成为可能?

1 个答案:

答案 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?"有关内存表示的更多信息:

interface