一尘不染

golang什么是导入副作用

go

import (
    _ "github.com/lib/pq"
    _ "image/png"
    ...
)

有效的去它说,这些类型的进口平均副作用。我已经阅读了几个SO答案,但没有一个解释什么是import side effect。有人可以详细说明这个词import side effect吗?


阅读 352

收藏
2020-07-02

共1个答案

一尘不染

当他们说“导入副作用”时,它们实际上是指静态使用的代码/功能。这意味着仅导入软件包将导致一些代码在应用程序启动时执行,从而使我的系统处于与未导入该软件包的状态不同的状态(init()例如示例中注册处理程序的代码,它也可能放下config文件,修改光盘上的资源等)。有效的go教程只是为了解释这一点,以说明开发人员可能要进行空白导入的原因。import _ "somepackageImNotUsingReally"

编辑:当我说init()我指的是这种方法时要添加其他上下文;https://golang.org/doc/effective_go.html#init-任何导入的软件包在调用main之前都会调用其init方法。不管有什么init()副作用。我认为不可能有其他任何东西,因为常量之类的东西将位于包范围内,而不是全局范围,因此它不会重新定义常量或类似的东西。

EDIT2:如注释中所指出并在上面的init链接中所述,“在包中的所有变量声明都评估了其初始化程序之后,将调用它”,这意味着代码PackageScopeVar := unexportedInitializerThatWritesToDisc()将运行并可能产生副作用。

2020-07-02