在 golang 中使用空白标识符导入的用例

Go 编程语言规范指出:“要仅为其副作用(初始化)导入包,请使用空白标识符作为显式包名称。”

例如:

import _ "foo/bar"

我很难想象这个构造的用例。对“import”语句的使用的公认答案提到了一个用例,其中可以加载数据库驱动程序而无需导入程序使用该包的任何导出函数,但它忽略了读者想象的细节。

是否有现实生活中的例子(带有代码片段和解释)来说明这个用例?


函数式编程
浏览 286回答 3
3回答

慕桂英546537

我正在编写一个调整图像大小的程序。我希望它能够识别不同格式的图像,如JPEG、PNG、GIF并将它们转换为JPEG。所以除了image和image/jpeg包,我还必须导入image/png并且image/gif只注册它们各自的解码器。如果我没有导入这些,缩放器将只能读取JPEG图像。package mainimport(  "image"  "image/jpeg" // I wanted to export the images as JPEG  _ "image/png"  _ "image/gif")// ...image包中的相关文档:解码任何特定的图像格式需要预先注册解码器功能。作为初始化该格式的包的副作用,注册通常是自动的,因此,要解码 PNG 图像,它就足够了:import _ "image/png"

皈依舞

这是因为init 函数每个源文件都可以定义自己的 niladicinit函数来设置所需的任何状态。(其实每个文件可以有多种init功能。)finally 的意思是 finally:init在包中的所有变量声明都评估了它们的初始值设定项之后调用,并且只有在所有导入的包都已初始化之后才评估它们。这就是“ Go 中 import 语句前面的下划线是什么意思”中提到的go-sqlite3 的工作原理。func init() {    sql.Register("sqlite3", &SQLiteDriver{})}你在“理解 Golang Packagese ”中有另一个例子:在某些情况下,我们可能只需要导入一个包来调用它的init方法,而我们不需要调用包的其他方法。如果我们导入了一个包并且没有在程序中使用包标识符,Go 编译器将显示错误。在这种情况下,我们可以使用一个空白标识符 ( _) 作为包别名,这样编译器会忽略不使用包标识符的错误,但仍然会调用该init函数。
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Go