ゼロ値とデフォルト値
CoddyのGOジャーニー「オブジェクト指向プログラミング」セクションの一部。レッスン 17/107。
Goでは、すべての変数にゼロ値があります。これは、明示的な初期化を行わずに変数を宣言したときに割り当てられるデフォルト値です。ゼロ値を理解することは、structを扱ううえで不可欠です。初期化されていないfieldには、これらのデフォルト値が自動的に設定されるためです。
各型には、それぞれゼロ値があります:
| 型 | ゼロ値 |
|---|---|
| int, float64 | 0 |
| string | "" (empty string) |
| bool | false |
| pointer, slice, map | nil |
structを作成すると、明示的に設定しないfieldはすべてゼロ値になります。
type User struct {
Name string
Age int
Active bool
}
func main() {
var u User
fmt.Println(u.Name) // "" (空文字列)
fmt.Println(u.Age) // 0
fmt.Println(u.Active) // false
}これは partial initialization にも適用されます。Only 指定した fields がカスタム値を取得します。
u := User{Name: "Alice"}
fmt.Println(u.Age) // 0
fmt.Println(u.Active) // false
ゼロ値により、struct は明示的な初期化なしですぐに使用できます。ただし、slice や map のような参照型には注意してください。それらのゼロ値は nil であり、初期化せずに使用しようとすると実行時パニックを引き起こす可能性があります。
チャレンジ
簡単Go におけるゼロ値の仕組みを示す Player profile system を構築しましょう。いくつかの field を明示的に設定し、その他の field はデフォルトのゼロ値に依存する game profile を作成します。
コードを 2 つのファイルに分けて整理します。
player.go: 次の fields を持つPlayerstruct を Define します:Username(string)、Level(int)、Score(int)、IsPremium(bool)、GuildName(string)。また、Player のすべての情報を formatted string として返すDisplayProfilemethod も作成します。main.go: input から username を Read し、partial initialization を使用して Player を作成します。Usernamefield だけを設定します。その後、設定されていない fields に Go がゼロ値を割り当てる様子を確認するため、完全な profile を Display します。
次の input が提供されます。
- 1 行目: Player の username
DisplayProfile method は、次の exact format の string を返す必要があります。
Username: [Username]
Level: [Level]
Score: [Score]
Premium: [IsPremium]
Guild: [GuildName]たとえば username が ShadowKnight の場合、出力には username と、initialization されていない fields のすべてのゼロ値が表示されます。
Username: ShadowKnight
Level: 0
Score: 0
Premium: false
Guild: Guild field のコロンの後に何も表示されていないことに注目してください。これは empty string のゼロ値です。この challenge を通して、明示的な値を指定しなかった場合に Go が各 type に正確に何を割り当てるのかを確認できます。
自分で試してみよう
package main
import (
"fmt"
)
func main() {
// 入力からユーザー名を読み取る
var username string
fmt.Scanln(&username)
// TODO: 部分的な初期化を使用してPlayerを作成する
// Usernameフィールドのみを設定し、他のフィールドはゼロ値を使用させる
// TODO: DisplayProfileメソッドを使用してプレイヤーのプロフィールを表示する
}
このレッスンには短いクイズがあります。レッスンを始めて解答し、進捗を記録しましょう。
オブジェクト指向プログラミングのすべてのレッスン
1Go オブジェクト指向の基礎
外部ファイルGo ワークスペースとモジュールパッケージとインポート公開された名前と非公開の名前Go におけるオブジェクト指向入門クラスとしての構造体構造体へのメソッド定義ポインタレシーバと値レシーバ構造体の初期化コンストラクタ関数まとめ:簡易計算機8エラー処理とOOP
error インターフェースカスタムエラー型エラーラッピング (fmt.Errorf)センチネルエラーerrors.Is() と errors.As()Panic、Defer、Recover復習 - ファイルパーサー自分で練習してみよう: Goオンラインコンパイラ