将语法和接口作为参数进行操作

 寂寞已成伤兑 发布于 2023-02-13 15:47

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

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

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

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被声明为类型SomeConcreteType.如果t 实际上是类型SomeConcreteType,v将保留该类型的实例并且ok将为true.否则,ok将是假的.有关详细信息,请参阅类型断言的规范.

    2023-02-13 15:50 回答
撰写答案
今天,你开发时遇到什么问题呢?
立即提问
热门标签
PHP1.CN | 中国最专业的PHP中文社区 | PNG素材下载 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有