Saya baru mengenali golang dan sedang mengkaji pakej dan cara mengimportnya berfungsi. Saya mempunyai beberapa soalan tentang import ini. Saya sedang membaca siaran ini (ia mempunyai lebih 7k suka jadi saya rasa ia tepat + ia adalah perkara pertama yang Google berikan kepada saya apabila saya menaip golang 包
).
Untuk menerangkan perkara yang saya tidak faham, izinkan saya terlebih dahulu menulis tentang bagaimana struktur projek dan kandungan semua fail.
pkg ├── mypkg | └── mypkg.go | ├── pkg1 | └── pkg1.go | └── pkg2 └── pkg2.go go.mod main.go
Seperti yang anda lihat, saya mempunyai modul dengan 3 pakej (4 pakej termasuk pakej utama). Kandungan semua pakej disenaraikan di bawah.
Kandunganpkg1.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() }
Oleh itu, main.go
包含 pkg1
和 pkg2
,并且 pkg1
和 pkg2
都包含 mypkg
. Artikel yang saya petik menyatakan perkara berikut (dalam huruf tebal):
the main thing to remember is, an imported package is initialized only once per package.
Dengan ini, saya menjangkakan output program saya adalah seperti ini:
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)
Harapan saya adalah untuk mengikuti langkah-langkah ini:
prom
Dalam kes saya (2.1.1)prom
Dalam kes saya (3.1.1)Sebaliknya, saya mendapat output berikut:
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
Nampaknya mypkg hanya dimulakan sekali semasa import pertama? ! Selain itu, pembolehubah global prom
在 pkg1 和 pkg2 中的地址是相同的(在本例中为 0x8fe360
mempunyai alamat yang sama dalam pkg1 dan pkg2 (0x8fe360
dalam kes ini).
Jadi soalan saya ialah:
mypkg
在 pkg1
中初始化一次,在 pkg2
Jika apa yang saya baca tidak betul, adakah sesiapa mempunyai artikel yang bagus tentang pakej dan modul dalam go?
main
Atas ialah kandungan terperinci Bagaimanakah proses import pakej golang berfungsi? Adakah terdapat cara untuk memulakan pakej beberapa kali dalam modul yang sama?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!