Go使用接口来泛化类型。因此,如果您想要一个带有特定接口的函数,则可以编写
func MyFunction(t SomeInterface) {...}SomeInterface可以将满足的每种类型传递给
MyFunction。
现在,
SomeInterface可以如下所示:
type SomeInterface interface { SomeFunction()}为了满足
SomeInterface,实现它的类型必须实现
SomeFunction()。
但是,如果您需要一个空接口(
interface{}),则该对象不需要实现要传递给该函数的任何方法:func MyFunction(t interface{}) { ... }上面的函数将采用所有类型,因为所有类型都实现了空接口。
找回类型
现在您可以拥有所有可能的类型,问题是如何取回之前实际输入的类型。空接口不提供任何方法,因此您无法在该值上调用任何东西。
为此,您需要类型声明:让运行时检查值Y中是否存在类型X,如果存在,则将其转换为该类型。
例:
func MyFunction(t interface{}) { v, ok := t.(SomeConcreteType) // ...}在此示例中,输入参数
t被断言为type
SomeConcreteType。如果
t实际上是type
SomeConcreteType,
v则将保存该类型的实例并且
ok为true。否则,
ok将为假。有关详细信息,请参见有关类型声明的规范。



