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

Go中下划线(空白标识符)的含义

锺离浩慨
2023-03-14
问题内容

当我阅读Go文档时,我发现了这一点:

您可以通过尝试分配,要求编译器检查类型T是否实现了接口I:

type T struct{}
var _ I = T{} // Verify that T implements I.

我不了解_的用途,并且在其他作业中也见过_,但无法理解它的含义。深入研究,我发现它被称为“空白标识符”,但我不理解他们放置的用例:

_ = x // evaluate x but ignore it

惯用语对我还是有点陌生​​,所以我试图理解为什么我想做这样的事情。


问题答案:

_是一个特殊的标识符,您可以为其分配任何内容,但永远不要读取。在第一个示例中,您给出了:

var _ I = T{}

无法访问此变量,因此将从结果程序中对其进行优化。但是,如果类型T不能分配给interface
,则可能会导致编译错误I。因此,在这种情况下,它被用作关于类型的静态断言。

第二种情况更常见。尽管丢弃函数调用的结果似乎很奇怪,但在具有多个返回的函数中它可能更有意义。考虑一个foo返回两个值的函数,但是您只对第一个感兴趣?您可以使用_忽略第二个:

a, _ = foo()

通过创建另一个变量来保存不需要的返回值,您可以得到相同的效果,但是此功能意味着您不必担心为其选择唯一的名称。



 类似资料:
  • The blank identifier 空白标识符 We’ve mentioned the blank identifier a couple of times now, in the context of for range loops and maps. The blank identifier can be assigned or declared with any value of an

  • 问题内容: Go编程语言规范指出:“要仅出于副作用(初始化)的目的导入软件包,请使用空白标识符作为显式软件包名称。” 例如: 我很难想象这种构造的用例。可接受的“import”语句用法答案提到了一个用例,其中可以在不需要导入程序使用该包的任何导出功能的情况下加载数据库驱动程序,但是它使细节遗漏了读者的想象力。 是否有现实生活中的示例(带有代码片段和说明)来说明此用例? 问题答案: 我正在编写一个调

  • 问题内容: 在标准库(glibc的)我看到与领先的双下划线,如定义的函数在。目的是什么?以及我们如何仍可以调用一个似乎未在任何地方声明的函数。我的意思是我们为此包括在内,但未声明,仅声明。 问题答案: 从GNU手册: 除了本手册中记录的名称外,保留名称还包括以下划线(’_’)开头的所有外部标识符(全局函数和变量)以及所有以两个下划线或下划线开头且后跟一个下划线的所有标识符(无论使用何种形式)大写字

  • Go 语言中的标识符和 C 语言中的标识符的含义样,是指程序员在程序中自己起的名字,变量名称、函数名称等 和 C 语言一样 Go 语言标识符也有一套 命名规则,Go语言标识符的命名规则几乎和C语言一模一样 只能由字母(a z、 AZ)、数字、下划线组成 不能包含除下划线以外的其它特殊字符串 不能以数字开头 不能是Go语言中的关键字 标识符严格区分大小写, test和Test是两个不同的标识符 和

  • rank ▲ ✰ vote url 64 365 174 322 url 在实例名字前单下划线和双下划线的含义 我想刨根问底,这到底是什么意思?解释一下他俩的区别. 单下划线 在一个类中的方法或属性用单下划线开头就是告诉别的程序这个属性或方法是私有的.然而对于这个名字来说并没有什么特别的. 引自PEP-8: 单下划线:"内部使用"的弱指示器.比如,from M import * 将不会引进用但下划

  • 问题内容: 该代码段的作用是什么? 我知道使用“ _”作为空白标识符,但是上述第二行实现了什么? 这是etcd GitHub存储库中的示例:etcd 问题答案: 该代码是机器生成的。生成器添加了这些语句,以避免在没有封送的情况下使用未声明的变量。 代码生成器的作者可能发现添加空白赋值语句比不需要时省略变量更容易。