Go 使用接口来泛化类型。因此,如果您想要一个采用特定接口的函数
你写
func MyFunction(t SomeInterface) {...}
每一个满足的类型SomeInterface
可以传递给MyFunction
.
Now, SomeInterface
可以看起来像这样:
type SomeInterface interface {
SomeFunction()
}
为了满足SomeInterface
,实现它的类型必须实现SomeFunction()
.
但是,如果您需要一个空接口(interface{}
)该对象不需要
实现要传递给函数的任何方法:
func MyFunction(t interface{}) { ... }
上面的这个函数将把每种类型视为所有类型都实现空接口 http://golang.org/ref/spec#Interface_types.
取回类型
现在您可以拥有每种可能的类型,问题是如何取回该类型
其实之前就已经放进去了。空接口不提供任何方法,因此您
不能调用这样的值的任何东西。
为此,您需要类型断言:让运行时检查值 Y 中是否存在类型 X 以及
如果是的话将其转换为该类型。
Example:
func MyFunction(t interface{}) {
v, ok := t.(SomeConcreteType)
// ...
}
本例中输入参数t
被断言为类型SomeConcreteType
. If t
实际上是类型SomeConcreteType
, v
将保存该类型的实例并且ok
将要
是真实的。否则,ok
将会是假的。看类型断言规范 http://golang.org/ref/spec#Type_assertions了解详情。