ฉันเห็นตัวอย่างนี้จากsqlite3
เมื่อGitHub
:
import (
"database/sql"
"fmt"
_ "github.com/mattn/go-sqlite3"
"log"
"os"
)
และดูเหมือนจะไม่สามารถค้นหาสิ่งที่ขีดล่างหน้าคำสั่งการนำเข้าหมายถึง
ฉันเห็นตัวอย่างนี้จากsqlite3
เมื่อGitHub
:
import (
"database/sql"
"fmt"
_ "github.com/mattn/go-sqlite3"
"log"
"os"
)
และดูเหมือนจะไม่สามารถค้นหาสิ่งที่ขีดล่างหน้าคำสั่งการนำเข้าหมายถึง
คำตอบ:
มันมีไว้สำหรับการนำเข้าแพคเกจสำหรับผลข้างเคียงเท่านั้น
จากข้อกำหนด Go :
หากต้องการนำเข้าแพคเกจสำหรับผลข้างเคียงเท่านั้น (การกำหนดค่าเริ่มต้น) ให้ใช้ตัวระบุที่ว่างเปล่าเป็นชื่อแพคเกจที่ชัดเจน:
นำเข้า _ "lib / คณิตศาสตร์"
ในกรณีของgo-sqlite3การนำเข้าขีดล่างใช้สำหรับผลข้างเคียงของการลงทะเบียนsqlite3
ไดรเวอร์เป็นไดรเวอร์ฐานข้อมูลในinit()
ฟังก์ชั่นโดยไม่ต้องนำเข้าฟังก์ชั่นอื่น ๆ :
sql.Register("sqlite3", &SQLiteDriver{})
เมื่อลงทะเบียนด้วยวิธีนี้ sqlite3 สามารถใช้กับsql
อินเทอร์เฟซของไลบรารีมาตรฐานในรหัสของคุณเช่นในตัวอย่าง:
db, err := sql.Open("sqlite3", "./foo.db")
ในขณะที่คำตอบอื่น ๆ อธิบายไว้อย่างสมบูรณ์สำหรับคน "แสดงให้ฉันเห็นรหัส" โดยทั่วไปหมายถึง: สร้างตัวแปรระดับแพ็กเกจและเรียกใช้init
ฟังก์ชันของแพคเกจนั้น
และ (ถ้ามี) ลำดับชั้นของตัวแปรระดับinit
ฟังก์ชั่นและฟังก์ชั่นของแพคเกจที่แพคเกจนี้ได้นำเข้า
ผลข้างเคียงเดียวที่แพคเกจสามารถสร้างได้โดยไม่ต้องถูกเรียกจริง ๆ คือการสร้างตัวแปรระดับแพ็คเกจ (สาธารณะหรือส่วนตัว) และภายในinit
ฟังก์ชัน
หมายเหตุ : มีเคล็ดลับในการเรียกใช้ฟังก์ชันก่อนหน้าที่จะinit
ทำงาน เราสามารถใช้ตัวแปรระดับแพ็กเกจสำหรับสิ่งนี้โดยการเริ่มต้นพวกเขาโดยใช้ฟังก์ชั่นนั้น
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
อาจเป็นงานที่กำลังดำเนินอยู่หรือนำเข้าเพื่อผลข้างเคียง ในกรณีนี้ฉันเชื่อว่าเป็นผลข้างเคียงดังที่อธิบายไว้ในเอกสาร