>백엔드 개발 >Golang >Go 언어로 패키지를 가져오는 방법

Go 언어로 패키지를 가져오는 방법

青灯夜游
青灯夜游원래의
2023-01-10 18:08:573052검색

Go 언어에서는 import 문을 통해 패키지를 가져올 수 있습니다. 가져온 패키지 이름은 큰따옴표로 묶여 있습니다. 패키지 이름은 GOPATH에서 시작하여 계산된 경로이며 "/"를 사용하여 경로를 구분합니다. 패키지를 가져오는 데는 두 가지 기본 형식이 있습니다. 1. 한 줄 가져오기 구문 "import "bao1" import "bao2""; 2. 여러 줄 가져오기 구문 "import("bao1" "bao2" ...)".

Go 언어로 패키지를 가져오는 방법

이 튜토리얼의 운영 환경: 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视频教程编程教学

위 내용은 Go 언어로 패키지를 가져오는 방법의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.