Rumah  >  Artikel  >  pembangunan bahagian belakang  >  Bagaimanakah proses import pakej golang berfungsi? Adakah terdapat cara untuk memulakan pakej beberapa kali dalam modul yang sama?

Bagaimanakah proses import pakej golang berfungsi? Adakah terdapat cara untuk memulakan pakej beberapa kali dalam modul yang sama?

PHPz
PHPzke hadapan
2024-02-06 08:54:08961semak imbas

golang 包导入流程如何工作?是否有一种方法可以在同一模块中多次初始化一个包?

Kandungan soalan

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.

Kandungan

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()
}
Kandungan

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()
}
Kandungan

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)
}
Kandungan

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 包含 pkg1pkg2,并且 pkg1pkg2 都包含 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:

  • Masukkan pakej utama (1)
  • pkg1 pakej dimulakan (2)
    • pakej mypkg telah dimulakan (2.1)
      • Semua pembolehubah global dalam mypkg dimulakan -prom Dalam kes saya (2.1.1)
      • Panggil fungsi init mypkg (2.1.2)
    • Panggil fungsi init pkg1 (2.2)
  • pkg2 pakej dimulakan (3)
    • pakej mypkg telah dimulakan (3.1)
      • Semua pembolehubah global dalam mypkg dimulakan -prom Dalam kes saya (3.1.1)
      • Panggil fungsi init mypkg (3.1.2)
    • Panggil fungsi init pkg2 (3.2)
  • Pengamatan pakej utama (4)
  • Panggil fungsi init utama (5)
  • Fungsi utama pakej utama dipanggil (6)

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:

  1. Adakah penulis artikel membuat kesilapan? Pakej yang diimport tidak dimulakan hanya sekali setiap pakej, tetapi sekali setiap modul? Adakah ini bermakna pembolehubah global dalam pakej sentiasa sama (alamat yang sama) sepanjang modul, tidak kira berapa kali pakej disertakan dan dari mana? Maksud saya ia hanya dimulakan
  2. sekali
  3. semasa import pertama? Adakah ada cara untuk membuat "aliran" saya berfungsi? Maksud saya setiap import akan memulakan pakej secara bebas? Dalam contoh saya ini bermakna memulakan sekali lagi dalam
  4. .
  5. mypkgpkg1 中初始化一次,在 pkg2Jika apa yang saya baca tidak betul, adakah sesiapa mempunyai artikel yang bagus tentang pakej dan modul dalam go?
  6. Saya tahu bahawa bagi sesetengah orang soalan ini adalah mengenai beberapa pengetahuan asas tentang golang, tetapi bagi saya sebagai pemula ia menyebabkan beberapa salah faham. Apatah lagi, hasil kerja program itu tidak sepadan dengan apa yang ditulis oleh pengarang artikel yang pertama kali muncul dalam carian Google. Sebarang bantuan dialu-alukan. Semua yang terbaik!

Jawapan betul

Pakej yang terkandung dalam program ini adalah satu set yang merupakan penutupan transitif semua pakej yang diimport bermula dari
. Iaitu:

main

Ini adalah satu set. Setiap pakej yang diimport disertakan sekali sahaja. Ini bermakna jika anda mentakrifkan pembolehubah dalam pakej, ia muncul sekali sahaja.
  • Semua pakej yang diimport dan pakej yang mereka import secara rekursif termasuk dalam binari akhir.
  • Untuk permulaan: langkah anda betul, hanya beberapa salinan
.

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!

Kenyataan:
Artikel ini dikembalikan pada:stackoverflow.com. Jika ada pelanggaran, sila hubungi admin@php.cn Padam