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

什么是接口断言?

仲鸿风
2023-03-14
问题内容

我刚刚在这篇博客文章中遇到了这段代码

type Logger interface {
    Debug(msg string, keyvals ...interface{}) error
    Info(msg string, keyvals ...interface{}) error
    Error(msg string, keyvals ...interface{}) error
}

type tmLogger struct {
    srcLogger kitlog.Logger
}

// Interface assertions
var _ Logger = (*tmLogger)(nil) // What is this?

// ... interface definition ...

什么是“接口断言”?


问题答案:

它将指向具体类型的nil指针分配给接口类型的变量。这是证明具体类型满足接口的一种常见做法-
如果不满足,则该行将无法编译,并给出一个错误,即无法将具体类型分配给该接口类型的变量,以及为什么。

正如@JimB指出的那样,“接口断言”是由作者组成的术语。Go没有这样的术语。具体来说,这是类型转换,先转换nil为的指针tmLogger,然后将类型化的nil指针分配给接口类型的空白标识符变量Logger。如果*tmLogger不满足Logger,任务将无法编译;但是,在运行时,由于使用的是nil值,因此不会占用任何内存

大概作者在“断言”的单元测试意义上比“类型断言”意义更多地使用了该术语-该行代码断言该类型实现了接口,否则,该行将失败。

鉴于这纯粹是测试实践,因此我个人将这些检查放在_test.go文件中,以便将它们包含在单元测试执行中,从最终二进制文件中排除,并且显然是测试套件的一部分,而不是应用程序逻辑。



 类似资料:
  • # 11.1 接口是什么 Go 语言不是一种 “传统” 的面向对象编程语言:它里面没有类和继承的概念。 但是 Go 语言里有非常灵活的 接口 概念,通过它可以实现很多面向对象的特性。接口提供了一种方式来 说明 对象的行为:如果谁能搞定这件事,它就可以用在这儿。 接口定义了一组方法(方法集),但是这些方法不包含(实现)代码:它们没有被实现(它们是抽象的)。接口里也不能包含变量。 通过如下格式定义接

  • 问题内容: 与这个问题相对应:Java中的接口是什么? 问题答案: 接口是抽象类的一种特殊形式,它不实现任何方法。在Java中,你可以这样创建一个接口: 由于该接口无法实现任何方法,因此这意味着整个事物(包括所有方法)都是公共的和抽象的(Java术语中的抽象含义是“未由此类实现”)。因此,上面的接口与下面的接口相同: 要使用此接口,你只需要实现该接口。许多类可以实现一个接口,而一个类可以实现许多接

  • 什么是中断 中断是我们在操作系统上首先实现的功能,因为它是操作系统所有功能的基础。假如没有中断,操作系统在唤起一个用户程序之后,就只能等到用户程序执行完成之后才能继续执行,那操作系统完全无法进行资源调度。 一个比喻 操作系统就像家长,他将孩子(用户程序)送到学校(开始运行)之后便不再管。 但是如果孩子闯了祸,老师(硬件)就找到家长,这便是异常 孩子的作业可能需要家长来签字(系统调用),他就会主动找

  • 问题内容: 接口允许您创建定义实现它的类的方法的代码。但是,您不能向这些方法添加任何代码。 抽象类使您可以做同样的事情,并向方法中添加代码。 现在,如果您可以使用抽象类实现相同的目标,为什么我们甚至需要接口的概念? 有人告诉我,它与从C ++到Java的OO理论有关,这是PHP的OO东西所基于的。这个概念在Java中有用但在PHP中没有用吗?这只是一种避免在抽象类中乱扔占位符的方法吗?我想念什么吗

  • 问题内容: 为什么我的内部类中没有接口?为什么是天生的?抱歉,如果这是一个愚蠢的问题,我已经尽力一遍又一遍地用Google搜索,但似乎无法将其包裹在脑海中。如为什么不能在内部类/局部类中声明这些? 同样作为一个确认,我们在接口中可以包含静态最终变量的原因是因为它们未指定状态或任何此类实现权?如果我们输了而只使用了final,那么我们需要一个没有意义的实例,因为您无法实例化接口。抱歉,我真的很困惑,

  • 问题内容: 当我发现它是一个接口时,我正在阅读接口。我不太了解什么是静态接口,它与常规接口有何不同? 这是接口的定义。此处的文档: Map.Entry 。 问题答案: 我对它不是内部接口的情况感到好奇。 所述改性剂只允许在嵌套类或接口。在您的示例中,嵌套在接口内部。 对于接口,修饰符实际上是可选的。对于接口来说,这种区别是没有意义的,因为它们不包含任何仍然可以访问外部接口的代码。