ホームページ  >  記事  >  バックエンド開発  >  Go言語のinit関数の詳しい説明

Go言語のinit関数の詳しい説明

尚
転載
2019-11-30 14:41:123915ブラウズ

Go言語のinit関数の詳しい説明

Go 言語 の init 関数は、パッケージの初期化に使用されます。この関数は Go 言語の重要な機能です。

には、以下の特徴:

1 init 関数は、パッケージ内の変数の初期化など、プログラムの実行前にパッケージを初期化するために使用される関数です。

2 各パッケージは複数の init 関数を持つことができます

3 パッケージの各ソース ファイルには複数の init 関数を含めることもできます

4 Go 言語では、同じパッケージ内の複数の init 関数の実行順序 (命令) が明確に定義されていません

5 異なるパッケージの init 関数は、パッケージによってインポートされた依存関係に従って初期化関数の実行順序を決定します。

6 init 関数は他の関数から呼び出すことはできませんが、他の関数よりも前に自動的に呼び出されます。 main 関数が実行されます。

次の例は、「やり方」から抜粋したものです。OS の違いは、アプリケーションの初期化中に隠されています。

var prompt = "Enter a digit, e.g. 3 " + "or %s to quit."

func init() {
    if runtime.GOOS == "windows" {
        prompt = fmt.Sprintf(prompt, "Ctrl+Z, Enter")
    } else { // Unix-like
        prompt = fmt.Sprintf(prompt, "Ctrl+D")
    }
}

次の 2 つの go ファイルは、次のことを示しています:

1 パッケージまたは go ファイルには複数の init 関数を含めることができます

2 init 関数は main 関数の前に実行されます

3 init 関数は自動的に呼び出され、呼び出すことはできません明示的に、この呼び出しは、関数が未定義であることを報告します

gprog.go コード

package main

import (
    "fmt"
)

// the other init function in this go source file
func init() {
    fmt.Println("do in init")
}

func main() {
    fmt.Println("do in main")
}

func testf() {
    fmt.Println("do in testf")
    //if uncomment the next statment, then go build give error message : .\gprog.go:19: undefined: init
    //init()
}

ginit1.go コードこのソース ファイルには 2 つの init 関数があることに注意してください

package main

import (
    "fmt"
)

// the first init function in this go source file
func init() {
    fmt.Println("do in init1")
}

// the second init function in this go source file
func init() {
    fmt.Println("do in init2")
}

上の 2 つのファイルをコンパイルします。 go build gprog.go ginit1.go

コンパイル後に gprog.exe を実行した結果は、gprog.go の init 関数が最初に実行され、次に 2 つの関数が実行されることを示しています。 ginit1.go の init 関数が実行され、その後 main 関数が実行されます。

E:\opensource\go\prj\hellogo>gprog.exe
do in init
do in init1
do in init2
do in main

注: 「The Way to Go」(P70) には、以下の赤字の説明があります。これは、go ソース ファイルには 1 つの init 関数

しか含めることができませんが、 go の 2 つの init 関数は、コンパイルと実行後に正常に実行されます (

)。したがって、この文はタイプミスであるはずです。

4.4.5 Init-functions
Apart from global declaration with initialization, variables can also be initialized in an init()-function.
This is a special function with the name init() which cannot be called, but is executed automatically
before the main() function in package main or at the start of the import of the package that
contains it.
Every source file can contain only 1 init()-function. Initialization is always single-threaded and
package dependency guarantees correct execution order.

推奨: ビデオ チュートリアルをご覧ください

以上がGo言語のinit関数の詳しい説明の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事はcnblogs.comで複製されています。侵害がある場合は、admin@php.cn までご連絡ください。