一尘不染

语法和接口作为参数起作用

go

我是Go编程语言的新手,最近遇到了以下代码:

func (rec *ContactRecord) Less(other interface{}) bool {
  return rec.sortKey.Less(other.(*ContactRecord).sortKey);
}

但是,我不理解函数签名背后的含义。它接受接口作为参数。你能解释一下这是怎么回事吗?谢谢


阅读 205

收藏
2020-07-02

共1个答案

一尘不染

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
SomeConcreteTypev则将保存该类型的实例并且ok为true。否则,ok将为假。有关详细信息,请参见有关类型声明的规范

2020-07-02