さらに3つの提案または手法があります。
追加フィールドあり
追加のフィールドを追加して、構造体が入力されているか空であるかを確認できます。私は意図的にそれに名前を付けましたが、それはaのゼロ値がであるためではready
ありません。したがって、そのフィールドのような新しい構造体を作成すると、フィールドは自動的に作成され、真実がわかります:構造体はまだ準備ができていない(空です)。empty
bool
false
Session{}
ready
false
type Session struct {
ready bool
playerId string
beehive string
timestamp time.Time
}
構造体を初期化するときは、に設定ready
する必要がありますtrue
。あなたのisEmpty()
あなただけのテストすることができますので、この方法は、(あなたがしたい場合は、1を作成することができますが)もう必要ありませんready
フィールド自体を。
var s Session
if !s.ready {
// do stuff (populate s)
}
この1つの追加bool
フィールドの重要性は、構造体が大きくなるか、比較できないフィールド(スライスmap
や関数の値など)が含まれる場合に増加します。
既存のフィールドのゼロ値の使用
これは前の提案に似ていますが、構造体が空でない場合は無効と見なされる既存のフィールドのゼロ値を使用します。これの使いやすさは実装に依存します。
たとえば、あなたの例ではあなたplayerId
が空string
""
にすることができない場合、これを使用して構造体が次のように空であるかどうかをテストできます:
var s Session
if s.playerId == "" {
// do stuff (populate s, give proper value to playerId)
}
この場合isEmpty()
、このチェックは実装に依存するため、このチェックをメソッドに組み込む価値があります。
func (s Session) isEmpty() bool {
return s.playerId == ""
}
そしてそれを使う:
if s.isEmpty() {
// do stuff (populate s, give proper value to playerId)
}
構造体へのポインターを使用する
2番目の提案は、構造体へのポインタを使用することです*Session
。ポインタはnil
値を持つことができるので、それをテストできます。
var s *Session
if s == nil {
s = new(Session)
// do stuff (populate s)
}