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であることに依存しています。
誰もが言うように、仕様はここで明確です:すべてのメモリが初期化(ゼロ)されます。標準パッケージと同様に、これを利用する必要があります。特に、独自の型の「デフォルトコンストラクタ」に依存し、New() *T
の種類の関数をスキップして&T{}
。
標準パッケージの多くのタイプがこれを利用しています。いくつかの例を示します。
クライアントはHTTPクライアントです。 ゼロの値(DefaultClient)は、DefaultTransportを使用する使用可能なクライアントです。
そして、あなたはvar DefaultClient = &Client{}
パッケージで宣言されています。
サーバーは、HTTPサーバーを実行するためのパラメーターを定義します。 サーバーのゼロ値は有効な構成です。
バッファは、読み取りおよび書き込みメソッドを備えたバイトの可変サイズのバッファです。 Bufferのゼロ値は、すぐに使用できる空のバッファーです。
var buf bytes.Buffer
を使用してください。この結果として、ブールメンバー変数が「否定」形式で使用されることもよくあります。たとえば、InsecureSkipVerify
in tls.Config
はVerify
と呼ばれません。これは、デフォルトの動作では証明書が検証されないためです(望ましいデフォルトにfalse
またはゼロの値を使用したいと考えています)。
最後に、あなたの質問に答えます:
しかし、このプロパティを利用し、デフォルト値で初期化する必要がある場合は、変数を明示的に初期化しないのが良いコーディング方法ですか?
はい、そうです。
短い宣言構文を使用する場合にのみ、変数をゼロ値に初期化します。
//less verbose than ''var count int''
count := 0
empty := ""
そうでなければ、それらを明示的に初期化することは単なるノイズです。初期化されていない変数に問題があると思うかもしれません...そしてあなたは正しいでしょう。幸いなことに、そのようなことはありません。ゼロ値は仕様の一部であり、突然変化することはありません。
変数が宣言されると、変数にはそのタイプのデフォルトのzero
またはnull
値が自動的に含まれます:0
for int
、0.0
はfloat
、false
はbool
、空の文字列はstring
、nil
はポインタ、ゼロ構造体などです。
Goのすべてのメモリが初期化されます!。
例えば: var arr [5]int
メモリ内は、次のように視覚化できます。
+---+---+---+---+ | | | | | +---+---+---+---+ 0 1 2 3
配列を宣言すると、その中の各項目は、タイプのデフォルトのゼロ値で自動的に初期化されます。ここでは、すべての項目のデフォルトは0です。
したがって、デフォルト値を使用して変数を明示的に宣言したい場合以外の場合は、デフォルト値なしで初期化することをお勧めします。