Go 言語では、import ステートメントを使用してパッケージをインポートできます。インポートされたパッケージ名は二重引用符で囲まれます。パッケージ名は GOPATH から計算されたパスであり、パスを区切るには「/」を使用します。パッケージのインポートには 2 つの基本的な形式があります: 1. 単一行のインポート構文「import "bao1" import "bao2"」; 2. 複数行のインポート構文「import("bao1" "bao2" ...)」。
このチュートリアルの動作環境: Windows 7 システム、GO バージョン 1.18、Dell G3 コンピューター。
Go 言語インポート インポート パッケージ - コード内で他のコードを使用する
Go 言語ソース ファイル パッケージ宣言ステートメントの後に使用できます。他の非インポート宣言ステートメントの前に、ゼロ個以上のインポート パッケージ宣言ステートメント。各インポート ステートメントでインポート パスを個別に指定することも、括弧を使用して複数のインポート パスを同時にインポートすることもできます。他のパッケージの識別子を参照するには、import キーワードを使用します。インポートされたパッケージ名は二重引用符で囲まれます。パッケージ名は、GOPATH から開始して計算され、/ で区切られたパスです。
デフォルトのインポート記述方法
インポートには、単一行インポートと複数行インポートという 2 つの基本的な形式があります。2 つのインポート方法によるインポート コードの効果同じです。
1) 単一行インポート
単一行インポートの形式は次のとおりです。
import "包1" import "包2"
2) 複数行インポート
複数インポートする場合行、パッケージ名はインポート内にあります順序はインポートの効果には影響しません。形式は次のとおりです:
import( "包1" "包2" … )
パッケージのインポート後に参照されるパッケージ名をカスタマイズします
両方を同時にインポートする場合 math/rand パッケージと crypto/rand パッケージなど、同じ名前の 2 つのパッケージがある場合、インポート ステートメントで新しいパッケージ名を指定する必要があります。競合を避けるために、同じ名前のパッケージが少なくとも 1 つあります。これをインポートされたパッケージの名前変更といいます。
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
説明 :
同じパッケージ内の複数の 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 中国語 Web サイトの他の関連記事を参照してください。