我只是想确认一下我对interface{}{}
的理解是否正确
interface{}{}
是指接口类型的复合字面值吗?
所以,如果我想传递一个复合类型,比如[]byte
作为interface{}
,我应该把它赋值给一个interface{}{}
类型的变量,然后传递这个变量,而如果我想传递一个非复合类型,比如int
作为interface{}
,我应该把它赋值给一个interface{}
类型的变量,然后传递那个变量。
我的理解对吗?
interface{}{}
语法无效。
它不是一个空的接口复合文字——没有这样的东西。以下代码不编译:
var a interface{}{} = "foo" // not a type
b := interface{}{} // not a value
来自规范复合文字:
复合字面值为结构体、数组、切片和映射构造值并在每次求值时创建一个新值。
有效的语法是interface{}
,这是一个空接口,即一个没有名称和空方法集的接口。
如果将其与命名接口进行比较,您将看到末尾的一组额外花括号没有意义:
type Fooer interface {
Foo() error
}{} // ???
您可以通过转换nil
:
interface{}
a := (interface{})(nil)
或者你可以声明一个未命名接口类型的变量:
type A struct {}
func (a A) Foo() string {
return "foo"
}
var a interface{ Foo() string } = A{}
回答你的问题:
所以,如果我想传递一个复合类型[…]
可以将任何值赋给interface{}
类型的变量,仅此而已。该值是否为复合值无关紧要,因为所有类型都满足空接口:
var a interface{} = []byte{0x01, 0x02}
var b interface{} = "string_literal"
游乐场:https://play.golang.org/p/w-l1dU-6Hb5
空接口interface{}
实际上表示"我不在乎"。任何东西都可以作为空接口传递。因此,对于您的示例,它们都可以存储为空接口。
一个可能更有趣的问题是,为什么你首先要避免类型,以及你想要达到什么目的。但是为了使用接口{},你可以向它传递任何东西,甚至是一个&;nil&;
interface{}
空接口类型- 您可以将
[]byte
或int
赋值给空接口(interface{}
类型)的任何空变量,或者您可以将其直接传递给不需要接口值的函数。