मैंने इस उदाहरण को 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"
)
और पता नहीं लग सकता है कि आयात विवरण के सामने अंडरस्कोर का क्या मतलब है।
जवाबों:
यह पूरी तरह से इसके दुष्प्रभावों के लिए एक पैकेज आयात करने के लिए है।
से जाओ विशिष्टता :
केवल इसके साइड-इफेक्ट्स (इनिशियलाइज़ेशन) के लिए एक पैकेज आयात करने के लिए, खाली पैकेज नाम के रूप में रिक्त पहचानकर्ता का उपयोग करें:
आयात _ "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
यह या तो कार्य प्रगति पर है, या दुष्प्रभावों के लिए आयात किया गया है। इस मामले में, मेरा मानना है कि यह दुष्प्रभावों के लिए है, जैसा कि डॉक्टर में वर्णित है।