什么是接口断言?

2024-01-02

我刚刚遇到了这段代码

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 没有这样的术语。具体来说,这是一个类型转换 https://golang.org/ref/spec#Conversions, 转换nil指向一个指针tmLogger,然后将类型化的 nil 指针分配给 a空白标识符 https://golang.org/ref/spec#Blank_identifier接口类型变量Logger. If *tmLogger不满足Logger,作业将无法编译;但是,在运行时,这不占用内存,因为它使用的是 nil 值。

想必作者更多地在“断言”的单元测试意义上使用这个术语,而不是“类型断言”的意义——该行代码断言该类型实现了该接口,如果没有,该行将失败。

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

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

什么是接口断言? 的相关文章

  • 从 C 调用带有字符串参数的 Go 函数?

    我可以从 C 调用一个没有参数的 Go 函数 按照下面的 https github com joeprivacy crefgo hello world 这通过编译go build和打印 Hello from Golang main func
  • 如何用 Go 将多个字符串解析为模板?

    有没有像这样的简单方法template ParseFiles base html home html 但是对于字符串来说 如何从一组字符串构建模板 我有一个基本模板和一个页面模板列表 全部为字符串 我想在基本模板之上构建它们 我想出了如何合
  • 识别推文消息中正确的主题标签索引

    我需要识别 Twitter 消息 各种语言 表情符号等 中的正确索引 我找不到返回这些位置的解决方案 如下例所示 import regexp testing github com stretchr testify require func
  • Go 中的格式错误 - %s %v 或 %w

    s v and w可用于格式化 Go 中的错误 将它们转换为字符串 fmt Errorf 它们在 Go 自己的工具中的使用方式似乎有所不同 In cmd go internal get path go https github com go
  • 如何获取字段类型的零值

    我有一个包含许多字段的结构 我已经弄清楚如何使用反射提取字段名称 值和标签信息 我还想做的是确定字段的值是否与字段的默认值不同 目前 我有这个 有效 但有点臭 qsMap make map string interface var defa
  • 从头开始使用映像部署无法启动

    我正在使用以下内容构建图像Dockerfile FROM golang 1 19 2 bullseye as builder COPY src src WORKDIR src RUN CGO ENABLED 1 go build race
  • gcloud 部署应用程序找不到导入包 - golang

    我已经将应用程序的一个版本部署到 GAE 但现在部署新版本时遇到问题 当我尝试时gcloud app deploy version VERSION 我收到一堆错误 显示远程构建找不到我的导入包 Beginning deployment of
  • 在 Go 中将 float 转换为 int 时如何舍入到最近的 int

    将 float 转换为 int 时 小数点将被丢弃 有什么干净的方法可以将其四舍五入到最接近的整数 x int 3 6 应等于 4 而不是 3 int f 0 5 如果 gt 5 将导致向上舍入
  • go:找到模块但不包含包

    我正在尝试安装 go 的网络包 但收到 不包含包错误 终端截图 我咨询过 go 模块 latest 已找到但不包含包 https stackoverflow com questions 62974985 go module latest f
  • Golang 中的“相互”包导入

    是否可以在 Golang 中执行 相互 包导入之类的操作 举例来说 我有两个包 A 和 B 分别具有 AFunc 和 BFunc BFunc2 函数 package A import B func AFunc do stuff but al
  • 将具有联合字段的 C 结构映射到 Go 结构

    我从 Go 中的某些 WinApi 的系统调用中获取结果 我可以轻松地从 C 代码映射简单的结构 但是如何处理如下所示的 C 结构 typedef struct SPC LINK DWORD dwLinkChoice define SPC
  • 数据源和数据集的区别

    我目前正在开发一个项目 其主要任务是读取存储在 SQL 数据库中的数据并以用户友好的形式显示它们 使用的编程语言是C 我在 Borland C Builder 6 环境中工作 但我认为标题中提出的问题与编程语言或库无关 当从数据库读取数据时
  • 通过 API Gateway 使用表单数据将图像发布到 Lambda 函数会导致文件无效

    I ve a 用 Go 编写的 Lambda 函数 https github com mhausenblas imgn blob master functions app uploadimg main go应该允许图像文件上传 通过 HTM
  • 当所有通道都关闭时中断 select 语句

    我有两个独立生成数据的 goroutine 每个将其发送到一个通道 在我的主 goroutine 中 我想在每个输出进入时使用它们 但不关心它们进入的顺序 每个通道在耗尽其输出时都会自行关闭 虽然 select 语句是像这样独立使用输入的最
  • 如何使用json传递opentracing数据

    我的 API 网关启动一个跟踪器和一个用于验证电子邮件的范围 然后它传递给user service用于验证 我想通过这个span详情至user service作为 json 对象并启动另一个span as a tracer start sp
  • 如何使用 mongo-go-driver 有效地将 bson 转换为 json?

    我想将 bson 转换为mongo go 驱动程序 https github com mongodb mongo go driver有效地转换为 json 我应该小心处理NaN 因为json Marshal失败如果NaN存在于数据中 例如
  • 使用Java查找无线网络的SSID

    我们正在做一个用 Java 编码的项目 为 JRE 1 6 编译 需要一些帮助 一个有点但明显复杂的功能 我们希望在连接特定无线网络时执行特定操作 例如当连接的 SSID myNetworkAtHome 或类似名称时 在浏览了这个网站 谷歌
  • Golang 网络爬虫 NTLM 身份验证

    Golang 网络抓取工具需要从经过 NTLM 验证的网页中提取信息 有了有效的用户名和密码 网络抓取工具如何与服务器进行 NTLM 4 次握手 以获得对后面受保护网页的访问权限 url username password http www
  • 界面与组合

    我想我理解接口和抽象之间的区别 抽象设置默认行为 在纯抽象的情况下 行为需要由派生类设置 接口是您所需要的 无需基类的开销 那么接口相对于组合的优势是什么 我能想到的唯一优点是在基类中使用受保护的字段 我缺少什么 你的标题没有意义 你的解释
  • 有没有一种方法可以在不停机的情况下更新 net/http 服务器中的 TLS 证书?

    我有一个简单的 https 服务器 提供一个简单的页面 如下所示 为简洁起见 没有错误处理 package main import crypto tls fmt net http func main mux http NewServeMux

随机推荐

  • Java 通过 Socket 传输属性

    首先 这是一个家庭作业问题 话虽如此 我被困住了 谷歌搜索 java Properties over Sockets 会得到很多不相关的东西 我正在尝试通过套接字传输 Properties 对象 API 说它可以通过 Stream 或 Wr
  • 将json字符串转换为java对象?

    我一直在寻找与将 JSON 字符串转换为 Java 对象相关的示例 但没有找到任何好的示例 我发现的那个非常基本 并且没有真正处理复杂的 JSON 字符串 我正在制作一个应用程序 使用谷歌翻译 API 将字符串从英语翻译成不同的语言 Goo
  • 带过滤器 Android 的自定义列表视图适配器

    请尝试在我的列表视图上实现过滤器 但每当文本发生变化时 列表就会消失 请帮忙 这是我的代码 适配器类 package com talagbe schymn import java util ArrayList import android
  • 从 Oracle 的 RAW(16) 转换为 .NET 的 GUID

    我在手动调试 NET 应用程序时遇到困难 其中 Guid 值与 NET 和 Oracle 不同 Where C reads 17D89D326C2142D69B989F5201288DBF Oracle reads 329DD817216C
  • 将 Windows SID 存储在数据库中以供查找

    我有一个 ASP NET MVC 应用程序 我需要允许客户根据其环境配置 MembershipProviders 但仍然能够将该 MembershipUser 映射到我们数据库中的具体用户模型 Membership GetUser 将使我能
  • 将 Java 套接字配置为在断开连接时快速失败?

    我的服务器上有一个监听端口 我使用 Java 类连接到该端口Socket接口 即 Socket mySocket new Socket host port 然后我抓起一个OutputStream 用一个装饰PrintWriter在自动刷新模
  • 具有滚动背景的 Recyclerview

    我正在尝试创建一个具有滚动背景的 RecyclerView 如下所示 这个想法是 当我向上 向下滚动视图保持器时 背景 浅绿色 图像也应该同步向上 向下移动 关于如何实现这一目标有任何线索吗 这是我的基本 RecyclerView 配置
  • 使用特定 SA 通过 Cloud Build 部署 Dataflow 管道

    我竭尽全力尝试使用特定 SA 而不是默认的 Cloud Build SA 从 Cloud Build 部署数据流管道 但到目前为止尚未成功 我遵循了这个过程 https cloud google com build docs secure
  • 将值从一种方法返回到另一种方法

    Assume as precondition that the list of players is not empty Returns the winning score that is the lowest total score re
  • 将非 ASCII/UTF-8 字符转换为 LaTeX 代码

    我们必须将非 ASCII UTF 8 或命名实体字符转换为 LaTeX 代码 现在我们使用非 ASCII 到 Unicode 然后使用 Perl 脚本将 Unicode 转换为 LaTeX 实体 例如 oacute gt o x000F3
  • python-requests post 带有 unicode 文件名

    我已经在这里阅读了几个相关的问题 但没有找到可行的解决方案 我有一个 Flask 服务器 其中包含以下简化代码 app Flask name api Api app class SendMailAPI Resource def post s
  • 使用 Excel VBA 更改连接字符串时创建的新数据连接

    我有一个工作簿 其中包含由宏更新的数据透视表 不过 在刷新数据之前 连接字符串会发生更改 With ThisWorkbook Connections Data ODBCConnection Connection Redacted Comma
  • 如何通过谷歌表格上的查询比较日期或日期与今天?

    我正在努力将sheet1的副本复制到另一个sheet2 同一文档 上 并且query 工作得很好 直到我想要过滤的列是公式单元格 每个都有查询 匹配等的长单元格 我想要做的是过滤sheet1中的行 其中M列中的事件日期即将到来 有更多过滤条
  • JPA 创建 - Hibernate 未显示在平台中

    我正在尝试创建一个使用 Hibernate 作为持久性提供者的 JPA 项目 但是当我单击平台时 它没有显示 Hibernate 它在平台下拉框中显示 Generic 和 EclipseLink 我应该怎么做才能在下拉框下获得 Hibern
  • Python os.system 命令不起作用?

    早些时候 我曾经很好地使用 python 进行编码 但是在我格式化计算机并重新安装相同的 python 设置之后 我的os system命令停止工作 以及subprocess Popen 看来是路径问题 我重现该 1 错误的唯一方法是将路径
  • 我如何告诉 PyCUDA 使用哪个 GPU?

    我的机器中有两张 NVidia 卡 并且都支持 CUDA 当我运行示例脚本以开始使用此处所示的 PyCUDA 时 http documen tician de pycuda http documen tician de pycuda 我得到
  • 使用 ECS Fargate 执行 Step Function“任务”

    在 Re Invent 2018 中 AWS 似乎推出了与 Step Functions 的新集成 其中包括 ECS Fargate 支持 https docs aws amazon com step functions latest dg
  • c_include_path 与 ld_library_path

    在 Ubunutu 12 04 或 Springdale 6 4 上 使用 gcc 和 g 有什么区别C INCLUDE PATH or CPLUS INCLUDE PATH and LD LIBRARY PATH 是个LD一个仅在运行时使
  • 异常消息是英文的吗?

    我们通过将 Exception Message 写入文件来记录系统中发生的任何异常 然而 它们是根据客户的文化编写的 土耳其的错误对我来说意义不大 那么我们如何才能在不改变用户文化的情况下用英语记录错误消息呢 这个问题可以部分解决 框架异常
  • 什么是接口断言?

    我刚刚遇到了这段代码 type Logger interface Debug msg string keyvals interface error Info msg string keyvals interface error Error