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

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

不过,我不明白函数签名背后的意思.它接受接口作为参数.你能给我解释一下这是怎么用的吗?谢谢

推荐答案

GO使用接口进行类型泛化.因此,如果您想要一个采用特定接口的函数 你写的是

func MyFunction(t SomeInterface) {...}

每种满足SomeInterface的类型都可以传递给MyFunction.

现在,SomeInterface个可以像这样:

type SomeInterface interface {
    SomeFunction()
}

要满足SomeInterface,实现它的类型必须实现SomeFunction().

但是,如果您需要空接口(interface{}),则对象不需要 实现要传递给函数的任何方法:

func MyFunction(t interface{}) { ... }

上面的函数将把每种类型作为all types implement the empty interface.

把字体拿回来

现在您可以拥有所有可能的类型,问题是如何将类型恢复为 实际上是之前放进go 的.空接口不提供任何方法,因此您 不能对这样的值调用任何东西.

为此,您需要类型断言:让运行库判断值Y中是否存在类型X,并且 如果是,请将其转换为该类型.

示例:

func MyFunction(t interface{}) {
    v, ok := t.(SomeConcreteType)
    // ...
}

在此示例中,输入参数t被断言为SomeConcreteType类型.如果t

Go相关问答推荐

包裹网.Conn导致挂起读取

GORM:一个表的两个外键

我可以在Golang中的另一个类型参数的基础上约束一个类型的参数吗?

Redis:尽管数据存在,但 rdb.Pipelined 中出现redis:nil错误

是否可以将 http.ServeHttp 包装在 go 中以使用 alexedwards/scs/v2 添加会话

使用goqu无法获取响应

Golang校验器包:重命名字段错误处理

如何将 DirName 和 serial 添加到 X509v3 Authority Key Identifier

错误!在为 age-viewer-go 运行 wails dev 或 wails build 命令时

获取 nil 指针类型的 reflect.Value

如何从 Go 中的 `HijackedResponse` 中删除 Cursor Position ANSI 转义码?

使用 Go 解组 SOAP 消息

无法使用 gocsv 读取引用字段

如何过滤来自 fsnotify 的重复系统消息

如何在切片增长时自动将切片的新元素添加到函数参数

使用 Golang 在字符串中循环重复数据

未定义 protoc protoc-gen-go 时间戳

Golang 工作池实现意外工作

如果服务器在客户端的 gRPC 中不可用,则等待的方法

如何使路径/不匹配 Golang net/http 中所有其他不匹配的路径