是否有可能在Go界面复合文字?



我只是想确认一下我对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&;

  1. interface{}空接口类型
  2. 您可以将[]byteint赋值给空接口(interface{}类型)的任何空变量,或者您可以将其直接传递给不需要接口值的函数。

最新更新