Tôi thấy ví dụ này từ sqlite3
trênGitHub
:
import (
"database/sql"
"fmt"
_ "github.com/mattn/go-sqlite3"
"log"
"os"
)
và dường như không thể tìm thấy ý nghĩa của dấu gạch dưới trước câu lệnh nhập.
Tôi thấy ví dụ này từ sqlite3
trênGitHub
:
import (
"database/sql"
"fmt"
_ "github.com/mattn/go-sqlite3"
"log"
"os"
)
và dường như không thể tìm thấy ý nghĩa của dấu gạch dưới trước câu lệnh nhập.
Câu trả lời:
Đó là để nhập một gói chỉ cho tác dụng phụ của nó.
Để nhập gói duy nhất cho các tác dụng phụ của nó (khởi tạo), hãy sử dụng mã định danh trống làm tên gói rõ ràng:
nhập _ "lib / toán"
Trong trường hợp go-sqlite3 , nhập khẩu gạch dưới được sử dụng cho tác dụng phụ của việc đăng ký sqlite3
trình điều khiển làm trình điều khiển cơ sở dữ liệu trong init()
hàm, mà không nhập bất kỳ chức năng nào khác:
sql.Register("sqlite3", &SQLiteDriver{})
Khi đã đăng ký theo cách này, sqlite3 có thể được sử dụng với sql
giao diện của thư viện chuẩn trong mã của bạn như trong ví dụ:
db, err := sql.Open("sqlite3", "./foo.db")
Trong khi các câu trả lời khác mô tả nó hoàn toàn, đối với người "Show me The Code", điều này về cơ bản có nghĩa là: tạo các biến cấp gói và thực hiện init
chức năng của gói đó.
Và (nếu có) hệ thống phân cấp của các biến & init
hàm cấp gói của gói đó, gói này đã được nhập.
Tác dụng phụ duy nhất mà một gói có thể tạo ra, mà không thực sự được gọi, là bằng cách tạo các biến cấp gói (công khai hoặc riêng tư) và bên trong init
chức năng của nó .
Lưu ý : Có một mẹo để chạy một chức năng trước cả init
chức năng. Chúng ta có thể sử dụng các biến mức gói cho việc này bằng cách khởi tạo chúng bằng hàm đó.
func theVeryFirstFunction() int {
log.Println("theVeryFirstFunction")
return 6
}
var (
Num = theVeryFirstFunction()
)
func init() { log.Println("init", Num) }
https://golang.org/doc/effective_go.html#blank
Đây là một công việc đang tiến hành, hoặc được nhập khẩu cho các tác dụng phụ. Trong trường hợp này, tôi tin rằng đó là tác dụng phụ, như được mô tả trong tài liệu.