golang什么是进口副作用

The*_*ist 10 go

import (
    _ "github.com/lib/pq"
    _ "image/png"
    ...
)
Run Code Online (Sandbox Code Playgroud)

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

eva*_*nal 13

当他们说'导入副作用'时,他们实质上指的是静态使用的代码/功能.意思是只是导入包会导致一些代码在app上执行,使我的系统处于不同于导入该包的状态(就像init()在他们的示例中的代码寄存器处理程序中的代码,它也可以放置配置文件,修改光盘上的资源等.有效的go教程解释这只是为了说明开发人员可能想要进行空白导入的原因,即;import _ "somepackageImNotUsingReally"

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

EDIT2:正如在注释中所指出并在上面的init链接中解释的那样"在包中的所有变量声明已经评估了它们的初始化器之后被调用"意味着代码PackageScopeVar := unexportedInitializerThatWritesToDisc()将会运行并且可能有副作用.

  • @Entei是的吗...首先,我解释了导入副作用是什么,而不是特定导入的副作用.如果您想知道它的具体副作用,那么请查看`sql.Register`的文档http://golang.org/pkg/database/sql/#Register ...如果再次调用该方法其他一些范围会引起恐慌.这会影响所有代码. (2认同)
  • "它只调用sql.Register("postgres",&drv {})"****是所需的副作用:包注册自己在包sql中已知. (2认同)