[英]How does the golang package import flow work and is there a way to initialize one package multiple times within the same module?
我是 golang 的新手,目前正在研究包和導入它們的工作原理。 我對這次進口有幾個問題。 我正在閱讀這篇文章(它有超過 7k 個贊,所以我猜它是准確的 + 這是當我輸入golang packages
時谷歌首先給我的)。
為了解釋我不明白的地方,我會先寫下項目結構是什么樣子的,以及所有文件的內容是什么。
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
並且pkg
和pkg2
都包括mypkg
。 我參考的文章陳述如下(粗體):
要記住的主要事情是,導入的 package 每個 package 只初始化一次。
考慮到這一點,我期待這樣的事情成為我程序的 output:
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)而不是它,我得到以下 output:
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 的一些基礎知識,但對於我這個初學者來說,這造成了一些誤解。 更重要的是,該程序的工作結果與谷歌搜索中最先出現的文章的作者所寫的不符。 歡迎任何幫助。 一切順利!
程序中包含的包是一個集合,它是從main
開始的所有導入包的傳遞閉包。 那是:
至於初始化:你的步驟是正確的,只是mypkg
只初始化了一次。 二進制文件中沒有mypkg
的多個副本。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.