当前位置: 首页 > 面试题库 >

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

郗学
2023-03-14
问题内容

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

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{}) { ... }

上面的函数将采用所有类型,因为所有类型都实现了空接口。

找回类型

现在您可以拥有所有可能的类型,问题是如何取回之前实际输入的类型。空接口不提供任何方法,因此您无法在该值上调用任何东西。

为此,您需要类型声明:让运行时检查值Y中是否存在类型X,如果存在,则将其转换为该类型。

例:

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

在此示例中,输入参数t被断言为type SomeConcreteType。如果t 实际上是type
SomeConcreteTypev则将保存该类型的实例并且ok为true。否则,ok将为假。有关详细信息,请参见有关类型声明的规范。



 类似资料:
  • 问题内容: 我不知道为什么此代码在PHP中不起作用? 看来它没有违反任何OOP规则,但是为什么它给我一个错误? 问题答案: 它 确实 违反了SOLID规则。您声明接受一个类型的参数,但子级接受一个类型的参数。即使是的子类型,它仍然是不同的类型。 当上课的时候,上课也是正确的。但是接受一个,但是不接受一个。因此,据推测,但不接受type参数。这打破了Liskov替代原则。您不能在子接口,周期中更改参

  • 问题内容: 我几天前接受采访时,被问到这样的问题。 问:反向链接列表。给出以下代码: 我很困惑,因为我不知道接口对象可以用作方法参数。面试官解释了一下,但我仍然不确定。有人可以启发我吗? 问题答案: 实际上,这是使用接口的最常见和最有用的方法之一。该接口定义了一个契约,您的代码可以与实现该接口的任何类一起使用,而无需了解具体的类- 它甚至可以与编写代码时尚不存在的类一起使用。 Java标准API中

  • 在编写了自己的通用功能接口并将其用于lambdas之后,我必须在一种新方法中使用它: 将通用数组作为输入处理,检查其最小长度是否为4 处理我的功能界面的任何实例 处理lambda表达式的任何实例,该表达式接受一个参数,但不返回任何内容 应用于函数接口实例的结果(这里我想我必须使用使用者) 以前从未使用过函数接口,有人能解释一下我应该如何将2个函数接口作为方法参数传递吗? 例如:

  • 我对Koltin lambdas有点困惑,我想知道如何使用它,给出以下代码片段: 以及需要将该接口作为参数传递的函数: 但是,相同的逻辑,但在Java中,按预期编译和运行。 和 在这种情况下,如何在静态编程语言中使用lambda?

  • 我们在应用程序中使用和。我们的项目通过以下方式创建了RxJava订阅服务器: null 但是,如果不使用参数Subscriber,同时创建一个全新的Subscriber,那么Observable就可以正常工作。 你知道我怎样才能让这件事和参数订阅者一起工作吗?我们希望从活动中调用无法从network service类访问的UI方法onComplete。 这是我的活动代码: 但是这个版本的网络服务类

  • 情况: 我正在尝试实现一个为项目分配权重的专用集合。 我无法使用