結論:
import時指定的字串,是相對於$gopath的目錄路徑,告訴了go,要去載入這個目錄下所有的包檔案(不包括子目錄中的檔案)
乙個目錄中所有的原始檔(不包括子目錄)代表了單獨的乙個包,這些原始檔內的package關鍵字指出的包名,必須一致,否則無法被使用
import指定的載入目錄、目錄中的原始檔名字、原始檔內通過package關鍵字指定的包名。這三者可以不一樣。匯入後,根據package指定的包名,來使用包中的匯出成員。
匯入兩個目錄,這兩個目錄中的原始檔內指定的包名,如果出現相同,則匯入目錄時會失敗
同乙個包,間接或直接被匯入多次。這個包只會被初始化一次。如init執行一次,包級別變數的記憶體只會被分配一次,後續要使用的話,則繼續使用上次分配時的值。(這個規律和nodejs也是一致的)這也就是為什麼使用mysql時,要匯入兩個包:
第二個包中引用了第乙個包,init函式中對第乙個包裡的資料進行了一些mysql相關的操作。使後續直接使用第乙個包時,能關聯得上mysql。匯入第二個包僅僅是為了執行裡面的init函式,從而影響第乙個包的行為。所以第二個包空匯入即可
當原始檔被載入時,檔案內的init函式會被自動執行:通過import來載入乙個目錄時,如果這個目錄中有多個原始檔,則這些原始檔中的init函式都會執行,但檔案之間的init函式的執行次序不確定,看go載入檔案是的順序
乙個原始檔內可以定義多個init函式,多個init函式會按順序從上往下執行。雖然乙個檔案內可以定義多個init,但是沒有這個必要,把邏輯都集中在乙個init函式中,效果一樣
$gopath目錄如下:
package maink1.go:import "m1
"func main()
package x1在以上的m1目錄中,建立乙個檔案k2.goimport
"fmt
"func show()
解決辦法:匯入的時候,將衝突的包名,重新命名為另乙個值即可,如以下k2pkg
如何理解go語言中的閉包
對於閉包的理解,按照下面2點切入即可 1,閉包函式的返回值是函式 2,返回的函式繫結在閉包函式內乙個變數上。對於第2條如果不好理解的話,可以這麼理解。把外層的函式去掉,把函式內定義的變數想象成全域性變數,把返回的函式想象成普通函式。本質上,就是返回了乙個函式,這個函式內操作的變數是在另乙個函式中定義...
Go 的包結構
除使用預設包名外,還可使用別名,已解決同名衝突問題。歸納起來,有四種不同的匯入方式。預設方式 test.a 別名方式 x.a 簡便方式 a 初始化方式 無法引用,僅用來初始化目標包 不能直接或間接匯入自己,不支援任何形式的迴圈匯入。許可權 所有成員在包內均可訪問,無論是否在同一原始碼檔案中。但只有名...
c c 碼農對go中包的錯誤理解
用現有的姿勢去解鎖新姿勢的過程中會有寫先入為主的錯誤,在解鎖新姿勢的過程中造成寫麻煩。最為乙個自學go的c c 碼農,在簡單掃過包這一概念時,直接把包理解成了.h檔案。忽略了包的本質。由於go的資料定義方式,導致我花了兩天時間也沒有找到相當於 命名空間 或者 static的全域性變數 的功能,進而讓...