我是 golang 新手,目前正在研究套件和導入它們的工作原理。我對這次進口有幾個問題。我正在閱讀這篇文章(它有超過 7k 個贊,所以我猜它是準確的 這是當我輸入 golang 包
時 google 給我的第一個內容)。
為了解釋我不明白的地方,我先寫一下專案結構是什麼樣的,所有文件的內容是什麼。
pkg ├── mypkg | └── mypkg.go | ├── pkg1 | └── pkg1.go | └── pkg2 └── pkg2.go go.mod main.go
如您所見,我有包含 3 個套件的模組(4 個套件包括主套件)。下面列出了所有包的內容。
pkg1.go 的內容:
package pkg1 import ( "fmt" "mymod/pkg/mypkg" ) func init() { fmt.println("hello everyone from pkg1 init") } func hellofrompkg1() { fmt.println("hello from pk1") mypkg.print() }
pkg2.go 的內容:
package pkg2 import ( "fmt" "mymod/pkg/mypkg" ) func init() { fmt.println("hello everyone from pkg2 init") } func hellofrompkg2() { fmt.println("hello from pk2") mypkg.print() }
mypkg 的內容:
package mypkg import "fmt" func init() { fmt.println("hello everyone from mypkg init") } var prom = 10 func print() { fmt.printf("address of prom inside mypkg is: %p\n", &prom) }
main.go 的內容:
package main import ( "fmt" "mymod/pkg/pkg1" "mymod/pkg/pkg2" ) func init() { fmt.println("hello everyone from main init") } func main() { pkg1.hellofrompkg1() pkg2.hellofrompkg2() }
因此,main.go
包含pkg1
和pkg2
,並且pkg1
和pkg2
都包含mypkg
。我引用的文章指出了以下內容(以粗體顯示):
the main thing to remember is, an imported package is initialized only once per package.
考慮到這一點,我期望我的程式的輸出是這樣的:
hello everyone from mypkg init hello everyone from pkg1 init hello everyone from mypkg init hello everyone from pkg2 init hello everyone from main init hello from pk1 address of prom inside mypkg is: 0xfee360 (some address) hello from pk2 address of prom inside mypkg is: 0xf321a3 (another address)
我的期望是遵循以下步驟:
prom
在我的情況下 (2.1.1)prom
在我的情況下 (3.1.1)取而代之的是,我得到以下輸出:
Hello everyone from mypkg init Hello everyone from pkg1 init Hello everyone from pkg2 init Hello everyone from main init Hello from pk1 address of prom inside mypkg is: 0x8fe360 Hello from pk2 address of prom inside mypkg is: 0x8fe360
看起來 mypkg 在第一次導入期間只初始化了一次? !另外,全域變數 prom
在 pkg1 和 pkg2 中的位址是相同的(在本例中為 0x8fe360
)。
所以我的問題是:
mypkg
在 pkg1
中初始化一次,在 pkg2
中初始化另一次。 我知道對某些人來說這些問題是關於 golang 的一些基礎知識,但對於我作為初學者來說這引起了一些誤解。更重要的是,該程式的工作結果與Google搜尋中首先出現的文章的作者所寫的內容不符。歡迎任何幫助。祝一切順利!
程式中包含的套件是一個集合,它是從 main
開始的所有導入套件的傳遞閉包。即:
至於初始化:您的步驟是正確的,只是 mypkg
只初始化一次。二進位檔案中沒有 mypkg
的多個副本。
以上是golang 套件導入流程如何運作?是否有一種方法可以在同一模組中多次初始化一個包?的詳細內容。更多資訊請關注PHP中文網其他相關文章!