Go 언어에서는 import 문을 통해 패키지를 가져올 수 있습니다. 가져온 패키지 이름은 큰따옴표로 묶여 있습니다. 패키지 이름은 GOPATH에서 시작하여 계산된 경로이며 "/"를 사용하여 경로를 구분합니다. 패키지를 가져오는 데는 두 가지 기본 형식이 있습니다. 1. 한 줄 가져오기 구문 "import "bao1" import "bao2""; 2. 여러 줄 가져오기 구문 "import("bao1" "bao2" ...)".
이 튜토리얼의 운영 환경: Windows 7 시스템, GO 버전 1.18, Dell G3 컴퓨터.
Go 언어 가져오기 가져오기 패키지 - 코드에서 다른 코드 사용
Go 언어 소스 파일 패키지 선언문 뒤와 기타 비 가져오기 선언문 앞에 가져오기 패키지 선언문을 0개 이상 포함할 수 있습니다. 각 import 문은 가져오기 경로를 개별적으로 지정하거나 괄호를 통해 여러 가져오기 경로를 동시에 가져올 수 있습니다. 다른 패키지의 식별자를 참조하려면 import 키워드를 사용할 수 있습니다. 가져온 패키지 이름은 큰따옴표로 묶여 있으며, GOPATH에서 시작하여 계산된 경로이며 /로 구분됩니다.
기본 가져오기 작성 방법
가져오기에는 한 줄 가져오기와 여러 줄 가져오기라는 두 가지 기본 형식이 있습니다. 두 가지 가져오기 방법의 가져오기 코드 효과는 동일합니다.
1) 단일 라인 가져오기
단일 라인 가져오기 형식은 다음과 같습니다.
import "包1" import "包2"
2) 다중 라인 가져오기
여러 라인을 가져올 때 가져오기에서 패키지 이름의 순서는 가져오기 효과에 영향을 주지 않습니다. 형식은 다음과 같습니다.
import( "包1" "包2" … )
Import 패키지 뒤에 참조되는 패키지 이름을 사용자 정의합니다
math/rand 패키지와 crypto와 같이 이름이 같은 두 패키지를 동시에 가져오려는 경우 /rand 패키지인 경우 import 문은 충돌을 피하기 위해 이름이 같은 패키지에 대해 최소한 새 패키지를 지정해야 합니다. 이를 가져온 패키지의 이름 바꾸기라고 합니다.
import ( "crypto/rand" mrand "math/rand" // 将名称替换为mrand避免冲突 )
가져온 패키지의 이름을 바꾸면 현재 소스 파일에만 영향을 미칩니다. 다른 소스 파일이 동일한 패키지를 가져오는 경우 가져온 패키지의 원래 기본 이름을 사용하거나 완전히 다른 이름으로 이름을 바꿀 수 있습니다.
가져오기 패키지 이름 바꾸기는 이름 충돌을 해결하는 것뿐만 아니라 유용한 기능입니다. 가져온 패키지 이름이 다루기 힘든 경우, 특히 일부 자동 생성 코드에서는 짧은 이름을 사용하는 것이 더 편리할 수 있습니다. 가져온 패키지의 이름을 짧은 이름으로 바꾸는 경우 패키지 이름의 혼동을 피하기 위해 일관성을 유지하는 것이 가장 좋습니다. 다른 패키지 이름을 선택하면 지역 공통 변수 이름과의 충돌을 피하는 데 도움이 될 수도 있습니다. 예를 들어 파일에 path라는 변수가 이미 있는 경우 "path" 표준 패키지의 이름을 pathpkg로 바꿀 수 있습니다.
각 가져오기 선언 문은 현재 패키지와 가져온 패키지 간의 종속성을 명확하게 지정합니다. 패키지 가져오기 루프가 발생하면 Go 언어 빌드 도구에서 오류를 보고합니다.
익명 패키지 가져오기 - 패키지만 가져오되 패키지의 유형과 값은 사용하지 마세요.
패키지의 구조와 유형을 사용하지 않고 패키지만 가져오려는 경우 패키지에 있는 임의의 함수를 호출하면 익명 가져오기 패키지를 사용할 수 있으며 형식은 다음과 같습니다.
import ( _ "path/to/package" )
그 중 path/to/package는 가져올 패키지 이름을 나타내고 밑줄 _은 익명 가져오기 패키지를 나타냅니다. .
익명으로 가져온 패키지는 다른 가져온 패키지와 마찬가지로 실행 파일로 컴파일됩니다. 동시에 가져온 패키지도 init() 함수 호출을 트리거합니다.
프로그램 시작 전 패키지의 초기화 진입점: init
특정 요구 사항 설계에서 프로그램이 참조하는 모든 패키지의 초기화 함수는 프로그램 시작 시 균일하게 호출되어야 합니다. 개발자 초기화 기능을 수동으로 호출해야 하는 경우 이 과정에서 오류나 누락이 발생할 수 있습니다. 우리는 참조된 패키지 내에서 패키지 작성자가 코드 시작에 대한 알림을 받고 프로그램이 시작될 때 자신의 패키지에 있는 코드에 대해 일부 초기화 작업을 수행하기를 바랍니다.
예를 들어 삼각함수 계산을 위한 수학 라이브러리의 실행 효율성을 높이기 위해 프로그램 시작 시 삼각함수의 값을 메모리에 미리 인덱스 테이블에 내장할 수 있으며, 외부 프로그램에서는 테이블을 조회하여 삼각함수의 값을 빠르게 얻을 수 있습니다. 그러나 삼각함수 인덱스 테이블의 초기화 함수에 대한 호출은 삼각함수를 외부에서 사용하는 모든 개발자가 호출할 것으로 예상되지 않습니다. 삼각함수 패키지 프로그램이 시작되는 시점을 알 수 있는 메커니즘이 삼각함수 패키지에 있는 경우, 그러면 초기화 문제가 해결될 수 있습니다.
Go 언어는 위의 문제에 대해 매우 편리한 기능인 init() 기능을 제공합니다.
init() 함수의 특징은 다음과 같습니다.
각 소스 코드에서는 1개의 init() 함수를 사용할 수 있습니다.
init() 함수는 프로그램이 실행되기 전(main() 함수가 실행되기 전) 자동으로 호출됩니다.
호출 순서는 깊이 우선 순서로 초기화되는 main()에서 참조되는 패키지에 대한 것입니다.
예를 들어, main→A→B→C와 같은 패키지 참조 관계가 있다고 가정하면 이러한 패키지의 init() 함수 호출 순서는 다음과 같습니다.
C.init→B.init→A.init→main
설명:
여러 개가 동일함 package init() 함수가 호출되는 순서는 예측할 수 없습니다.
init() 함수는 다른 함수에서 호출할 수 없습니다.
理解包导入后的init()函数初始化顺序
Go 语言包会从 main 包开始检查其引用的所有包,每个包也可能包含其他的包。Go 编译器由此构建出一个树状的包引用关系,再根据引用顺序决定编译顺序,依次编译这些包的代码。
在运行时,被最后导入的包会最先初始化并调用 init() 函数。
通过下面的代码理解包的初始化顺序。
代码8-3 包导入初始化顺序入口(…/chapter08/pkginit/main.go)
package main import "chapter08/code8-2/pkg1" func main() { pkg1.ExecPkg1() }
代码说明如下:
第 3 行,导入 pkg1 包。
第 7 行,调用 pkg1 包的 ExecPkg1() 函数。
代码8-4 包导入初始化顺序pkg1(…/chapter08/pkginit/pkg1/pkg1.go)
package pkg1 import ( "chapter08/code8-2/pkg2" "fmt" ) func ExecPkg1() { fmt.Println("ExecPkg1") pkg2.ExecPkg2() } func init() { fmt.Println("pkg1 init") }
代码说明如下:
第 4 行,导入 pkg2 包。
第 8 行,声明 ExecPkg1() 函数。
第 12 行,调用 pkg2 包的 ExecPkg2() 函数。
第 15 行,在 pkg1 包初始化时,打印 pkg1 init。
代码8-5 包导入初始化顺序pkg2(…/chapter08/pkginit/pkg2/pkg2.go)
package pkg2 import "fmt" func ExecPkg2() { fmt.Println("ExecPkg2") } func init() { fmt.Println("pkg2 init") }
代码说明如下:
第 5 行,声明 ExecPkg2() 函数。
第 10 行,在 pkg2 包初始化时,打印 pkg2 init。
执行代码,输出如下:
pkg2 init pkg1 init ExecPkg1 ExecPkg2
위 내용은 Go 언어로 패키지를 가져오는 방법의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!