为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

Go
函数式编程 2021-08-30 16:32:43
Go 编程语言规范指出:“要仅为其副作用(初始化)导入包,请使用空白标识符作为显式包名称。”例如:import _ "foo/bar"我很难想象这个构造的用例。对“import”语句的使用的公认答案提到了一个用例,其中可以加载数据库驱动程序而无需导入程序使用该包的任何导出函数,但它忽略了读者想象的细节。是否有现实生活中的例子(带有代码片段和解释)来说明这个用例?
查看完整描述

3 回答

?
慕桂英546537

TA贡献1848条经验 获得超10个赞

我正在编写一个调整图像大小的程序。我希望它能够识别不同格式的图像,如JPEG、PNG、GIF并将它们转换为JPEG。


所以除了image和image/jpeg包,我还必须导入image/png并且image/gif只注册它们各自的解码器。


如果我没有导入这些,缩放器将只能读取JPEG图像。


package main


import(

  "image"

  "image/jpeg" // I wanted to export the images as JPEG

  _ "image/png"

  _ "image/gif"

)


// ...

image包中的相关文档:


解码任何特定的图像格式需要预先注册解码器功能。作为初始化该格式的包的副作用,注册通常是自动的,因此,要解码 PNG 图像,它就足够了:


import _ "image/png"


查看完整回答
反对 回复 2021-08-30
?
皈依舞

TA贡献1851条经验 获得超3个赞

这是因为init 函数


每个源文件都可以定义自己的 niladicinit函数来设置所需的任何状态。(其实每个文件可以有多种init功能。)


finally 的意思是 finally:init在包中的所有变量声明都评估了它们的初始值设定项之后调用,并且只有在所有导入的包都已初始化之后才评估它们。


这就是“ Go 中 import 语句前面的下划线是什么意思”中提到的go-sqlite3 的工作原理。


func init() {

    sql.Register("sqlite3", &SQLiteDriver{})

}

你在“理解 Golang Packagese ”中有另一个例子:


在某些情况下,我们可能只需要导入一个包来调用它的init方法,而我们不需要调用包的其他方法。

如果我们导入了一个包并且没有在程序中使用包标识符,Go 编译器将显示错误。

在这种情况下,我们可以使用一个空白标识符 ( _) 作为包别名,这样编译器会忽略不使用包标识符的错误,但仍然会调用该init函数。


查看完整回答
反对 回复 2021-08-30
  • 3 回答
  • 0 关注
  • 275 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信