golang 패키지 가져오기 프로세스는 어떻게 작동하나요? 동일한 모듈에서 패키지를 여러 번 초기화하는 방법이 있습니까?

PHPz
풀어 주다: 2024-02-06 08:54:08
앞으로
941명이 탐색했습니다.

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

질문 내용

저는 golang을 처음 접했고 현재 패키지와 패키지 가져오기 작동 방법을 조사하고 있습니다. 이번 수입에 관해 몇 가지 질문이 있습니다. 나는 이 게시물을 읽고 있습니다(좋아요가 7,000개가 넘었기 때문에 정확하다고 생각합니다. + 내가 입력할 때 Google이 제공하는 첫 번째 항목입니다 golang 包 ).

제가 이해하지 못하는 부분을 설명하기 위해 먼저 프로젝트 구조가 어떤지, 모든 파일의 내용은 무엇인지 적어보겠습니다.

으아악

보시다시피 3개의 패키지(메인 패키지를 포함해 4개의 패키지)로 구성된 모듈이 있습니다. 모든 패키지의 내용은 다음과 같습니다.

pkg1.go의 내용:

으아악

pkg2.go의 내용:

으아악

mypkg의 내용:

으아악

main.go의 내용:

으아악

그러므로 main.go 包含 pkg1pkg2,并且 pkg1pkg2 都包含 mypkg. 내가 인용한 기사에는 다음과 같은 내용이 나와 있습니다(굵은 글씨):

으아악

이를 염두에 두고 내 프로그램의 출력은 다음과 같을 것으로 예상됩니다.

으아악

저는 다음 단계를 따르기를 기대합니다:

  • 메인 패키지(1) 들어가기
  • pkg1 패키지 초기화됨 (2)
    • mypkg 패키지가 초기화되었습니다(2.1)
      • mypkg의 모든 전역 변수가 초기화됩니다. -prom 제 경우(2.1.1)
      • mypkg(2.1.2)의 init 함수 호출
    • pkg1(2.2)의 초기화 함수 호출
  • pkg2 패키지 초기화됨 (3)
    • mypkg 패키지가 초기화되었습니다(3.1)
      • mypkg의 모든 전역 변수가 초기화됩니다. -prom 제 경우에는 (3.1.1)
      • mypkg의 init 함수 호출(3.1.2)
    • pkg2(3.2)의 초기화 함수 호출
  • 메인 패키지 초기화(4)
  • 메인의 초기화 함수 호출 (5)
  • 메인 패키지의 주요 기능은 (6)입니다

대신 다음과 같은 결과가 출력됩니다.

으아악

mypkg 첫 번째 가져오기 중에 한 번만 초기화 되는 것 같나요? ! 또한 전역 변수 prom 在 pkg1 和 pkg2 中的地址是相同的(在本例中为 0x8fe360는 pkg1과 pkg2에서 동일한 주소를 갖습니다(이 경우 0x8fe360).

제 질문은:

  1. 글 작성자가 실수한 걸까요? 가져온 패키지는 패키지당 한 번만 초기화되지 않고 모듈당 한 번 초기화됩니다. 이것은 패키지가 포함된 횟수와 출처에 상관없이 패키지의 전역 변수가 모듈 전체에서 항상 동일(동일한 주소)하다는 것을 의미합니까? 첫 번째 가져오기 중에
  2. 한 번만
  3. 초기화된다는 뜻인가요? 내 "흐름"이 작동하도록 하는 방법이 있나요? 각 가져오기가 패키지를 독립적으로 초기화한다는 뜻인가요? 내 예에서는
  4. 에서 한 번 더 초기화하는 것을 의미합니다.
  5. mypkgpkg1 中初始化一次,在 pkg2내가 읽은 내용이 잘못된 경우 Go의 패키지 및 모듈에 대한 좋은 기사가 있는 사람이 있나요?
  6. 어떤 사람들에게는 이러한 질문이 golang에 대한 기본 지식에 관한 것이라는 것을 알고 있지만, 초보자인 저에게는 이것이 약간의 오해를 불러일으켰습니다. 게다가 프로그램의 작업 결과는 Google 검색에 처음 등장한 기사의 작성자가 작성한 내용과 일치하지 않았습니다. 어떤 도움이라도 환영합니다. 최선을 다하길 바랍니다!

정답

프로그램에 포함된 패키지는
부터 가져온 모든 패키지를 임시 폐쇄하는 세트입니다. 즉:

main

세트입니다. 가져온 각 패키지는 한 번만 포함됩니다. 이는 패키지에서 변수를 정의하면 해당 변수가 한 번만 나타남을 의미합니다.
  • 가져온 모든 패키지와 재귀적으로 가져오는 패키지는 최종 바이너리에 포함됩니다.
  • 초기화의 경우: 단계가 정확합니다.
의 여러 복사본만 있으면 됩니다.

위 내용은 golang 패키지 가져오기 프로세스는 어떻게 작동하나요? 동일한 모듈에서 패키지를 여러 번 초기화하는 방법이 있습니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

원천:stackoverflow.com
본 웹사이트의 성명
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.
인기 튜토리얼
더>
최신 다운로드
더>
웹 효과
웹사이트 소스 코드
웹사이트 자료
프론트엔드 템플릿
회사 소개 부인 성명 Sitemap
PHP 중국어 웹사이트:공공복지 온라인 PHP 교육,PHP 학습자의 빠른 성장을 도와주세요!