web-dev-qa-db-ja.com

変数にデフォルト値を割り当てる必要がありますか?

Goでは、変数が宣言されると、仕様で説明されているようにゼロ値で初期化されます。

http://golang.org/ref/spec#The_zero_value

ただし、このプロパティを使用し、デフォルト値で初期化する必要がある場合は、変数を明示的に初期化しないことをお勧めします。

たとえば、次の例では

http://play.golang.org/p/Mvh_zwFkO

package main

import "fmt"

type B struct {
    isInit bool
    Greeting string
}

func (b *B) Init() {
    b.isInit = true
    b.Greeting = "Thak you for your time"
}

func (b *B) IsInitialized() bool {
    return b.isInit
}

func main() {
    var b B
    if !b.IsInitialized(){
        b.Init()
    }
    fmt.Println(b.Greeting)
}

プログラムはブール値のデフォルト値がfalseであることに依存しています。

11
Mayank Patel

誰もが言うように、仕様はここで明確です:すべてのメモリが初期化(ゼロ)されます。標準パッケージと同様に、これを利用する必要があります。特に、独自の型の「デフォルトコンストラクタ」に依存し、New() *Tの種類の関数をスキップして&T{}

標準パッケージの多くのタイプがこれを利用しています。いくつかの例を示します。

http.Client

クライアントはHTTPクライアントです。 ゼロの値(DefaultClient)は、DefaultTransportを使用する使用可能なクライアントです。

そして、あなたはvar DefaultClient = &Client{}パッケージで宣言されています。

http.Server

サーバーは、HTTPサーバーを実行するためのパラメーターを定義します。 サーバーのゼロ値は有効な構成です。

bytes.Buffer

バッファは、読み取りおよび書き込みメソッドを備えたバイトの可変サイズのバッファです。 Bufferのゼロ値は、すぐに使用できる空のバッファーです。

var buf bytes.Bufferを使用してください。この結果として、ブールメンバー変数が「否定」形式で使用されることもよくあります。たとえば、InsecureSkipVerify in tls.ConfigVerifyと呼ばれません。これは、デフォルトの動作では証明書が検証されないためです(望ましいデフォルトにfalseまたはゼロの値を使用したいと考えています)。

最後に、あなたの質問に答えます:

しかし、このプロパティを利用し、デフォルト値で初期化する必要がある場合は、変数を明示的に初期化しないのが良いコーディング方法ですか?

はい、そうです。

5
tomasz

短い宣言構文を使用する場合にのみ、変数をゼロ値に初期化します。

//less verbose than ''var count int''
count := 0
empty := ""

そうでなければ、それらを明示的に初期化することは単なるノイズです。初期化されていない変数に問題があると思うかもしれません...そしてあなたは正しいでしょう。幸いなことに、そのようなことはありません。ゼロ値は仕様の一部であり、突然変化することはありません。

7
Staven

変数が宣言されると、変数にはそのタイプのデフォルトのzeroまたはnull値が自動的に含まれます:0 for int0.0floatfalsebool、空の文字列はstringnilはポインタ、ゼロ構造体などです。

Goのすべてのメモリが初期化されます!

例えば: var arr [5]intメモリ内は、次のように視覚化できます。

+---+---+---+---+ | | | | | +---+---+---+---+ 0 1 2 3

配列を宣言すると、その中の各項目は、タイプのデフォルトのゼロ値で自動的に初期化されます。ここでは、すべての項目のデフォルトは0です。

したがって、デフォルト値を使用して変数を明示的に宣言したい場合以外の場合は、デフォルト値なしで初期化することをお勧めします。

3
Endre Simo