在go中导入时使用_有什么意义

Sal*_*ali 0 go

我在导入包时在 go 中看到了一个奇怪的语法:import _ fmt

我知道它的import f fmt作用就像这个包的别名,而且我也知道它被_用作不应该关心的变量。

因此,无需猜测我在这里导入了一个我不会使用的包。事实上,看起来这就是这里正在发生的事情。


我不明白的是为什么这可能会有所帮助。如果我使用for _, v := range(arr){}我使用,_因为我别无选择,我需要向编译器指定它不应该担心我不会使用的变量。

但如果我不打算使用某个包,我会忽略它(如果它以后可能有用,我会评论它)。但没有理由将其编译并添加到源代码中。

那么使用这种语法有什么意义吗?或者这只是组合别名和未使用的变量而产生的无用的产物?

Rob*_*ier 6

这意味着您要导入它以消除副作用。它通常与包含init. 当然,您也可以正常导入它,但这_清楚地表明您只想要副作用。

在Effective Go中搜索“导入副作用”进行讨论。

一个非常常见的例子是net/http/pprof,它将一些新的处理程序附加到默认的多路复用器。类似的软件包github.com/SlyMarbo/spdy以同样的方式使用它来默默地修改默认的 http 客户端。