Dấu gạch dưới trước câu lệnh nhập có nghĩa là gì?


207

Tôi thấy ví dụ này từ sqlite3trê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:


218

Câu trả lời ngắn:

Đó là để nhập một gói chỉ cho tác dụng phụ của nó.

Từ thông số kỹ thuật của Go :

Để 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 sqlite3

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ý sqlite3trì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 sqlgiao 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")

34

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 initchức năng của gói đó.

Và (nếu có) hệ thống phân cấp của các biến & inithà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 initchức năng của nó .

Lưu ý : Có một mẹo để chạy một chức năng trước cả initchứ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) }

17

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.


Đây là một liên kết đến nhập neo cho hiệu ứng phụ trên trang đó. Nó giải thích, "đôi khi chỉ hữu ích khi nhập gói cho các tác dụng phụ của nó, mà không sử dụng rõ ràng" và "Để chỉ nhập gói cho các tác dụng phụ của nó, đổi tên gói thành mã định danh trống".
Luke Sheppard
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.