I saw this example from sqlite3
on GitHub
:
import (
"database/sql"
"fmt"
_ "github.com/mattn/go-sqlite3"
"log"
"os"
)
and cannot seem to find what the underscore in front of an import statement means.
I saw this example from sqlite3
on GitHub
:
import (
"database/sql"
"fmt"
_ "github.com/mattn/go-sqlite3"
"log"
"os"
)
and cannot seem to find what the underscore in front of an import statement means.
While other answers described it completely, for "Show me The Code" people, this basically means: create package-level variables and execute the
init
function of that package.And (if any) the hierarchy of package-level variables &
init
functions of packages that, this package has imported.The only side effect that a package can make, without being actually called, is by creating package-level variables (public or private) and inside it's
init
function.Note: There is a trick to run a function before even
init
function. We can use package level variables for this by initializing them using that function.Short answer:
It's for importing a package solely for its side-effects.
From the Go Specification:
In sqlite3
In the case of go-sqlite3, the underscore import is used for the side-effect of registering the
sqlite3
driver as a database driver in theinit()
function, without importing any other functions:Once it's registered in this way, sqlite3 can be used with the standard library's
sql
interface in your code like in the example:https://golang.org/doc/effective_go.html#blank
It's either a work in progress, or imported for side effects. In this case, I believe it's for the side effects, as described in the doc.