Apa arti garis bawah di depan pernyataan impor?

207

Saya melihat contoh ini dari sqlite3padaGitHub :

import (
        "database/sql"
        "fmt"
        _ "github.com/mattn/go-sqlite3"
        "log"
        "os"
)

dan sepertinya tidak dapat menemukan arti garis bawah di depan pernyataan impor.

Adrian
sumber

Jawaban:

218

Jawaban singkat:

Ini untuk mengimpor paket semata-mata karena efek sampingnya.

Dari Spesifikasi Go :

Untuk mengimpor paket hanya untuk efek sampingnya (inisialisasi), gunakan pengidentifikasi kosong sebagai nama paket eksplisit:

impor _ "Lib / Matematika"

Dalam sqlite3

Dalam kasus go-sqlite3 , impor garis bawah digunakan untuk efek samping mendaftarkan sqlite3driver sebagai driver basis data dalam init()fungsi, tanpa mengimpor fungsi lain:

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

Setelah terdaftar dengan cara ini, sqlite3 dapat digunakan dengan sqlantarmuka pustaka standar dalam kode Anda seperti dalam contoh:

db, err := sql.Open("sqlite3", "./foo.db")
Herman Schaaf
sumber
34

Sementara jawaban lain menggambarkannya sepenuhnya, untuk orang-orang "Tunjukkan Kode", ini pada dasarnya berarti: membuat variabel tingkat paket dan menjalankan initfungsi paket itu.

Dan (jika ada) hierarki variabel tingkat paket & initfungsi paket yang telah diimpor oleh paket ini.

Satu-satunya efek samping yang dapat dibuat suatu paket, tanpa benar-benar dipanggil, adalah dengan membuat variabel tingkat paket (publik atau pribadi) dan di dalam initfungsinya.

Catatan : Ada trik untuk menjalankan fungsi sebelum initfungsi genap . Kita bisa menggunakan variabel level paket untuk ini dengan menginisialisasi mereka menggunakan fungsi itu.

func theVeryFirstFunction() int {
    log.Println("theVeryFirstFunction")
    return 6
}

var (
    Num = theVeryFirstFunction()
)

func init() { log.Println("init", Num) }
Kaveh Shahbazian
sumber
17

https://golang.org/doc/effective_go.html#blank

Entah itu sedang dalam proses, atau diimpor untuk efek samping. Dalam hal ini, saya percaya ini untuk efek samping, seperti yang dijelaskan dalam dokumen.

jgritty
sumber
Berikut tautan ke jangkar Impor untuk efek samping pada halaman itu. Ini menjelaskan, "kadang-kadang berguna untuk mengimpor paket hanya untuk efek sampingnya, tanpa penggunaan eksplisit", dan "Untuk mengimpor paket hanya untuk efek sampingnya, ubah nama paket menjadi pengidentifikasi kosong".
Luke Sheppard