Menu
Coddy logo textTech

ゼロ値とデフォルト値

CoddyのGOジャーニー「オブジェクト指向プログラミング」セクションの一部。レッスン 17/107。

Goでは、すべての変数にゼロ値があります。これは、明示的な初期化を行わずに変数を宣言したときに割り当てられるデフォルト値です。ゼロ値を理解することは、structを扱ううえで不可欠です。初期化されていないfieldには、これらのデフォルト値が自動的に設定されるためです。

各型には、それぞれゼロ値があります:

ゼロ値
int, float640
string"" (empty string)
boolfalse
pointer, slice, mapnil

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 であり、初期化せずに使用しようとすると実行時パニックを引き起こす可能性があります。

challenge icon

チャレンジ

簡単

Go におけるゼロ値の仕組みを示す Player profile system を構築しましょう。いくつかの field を明示的に設定し、その他の field はデフォルトのゼロ値に依存する game profile を作成します。

コードを 2 つのファイルに分けて整理します。

  • player.go: 次の fields を持つ Player struct を Define します: Username (string)、Level (int)、Score (int)、IsPremium (bool)、GuildName (string)。また、Player のすべての情報を formatted string として返す DisplayProfile method も作成します。
  • main.go: input から username を Read し、partial initialization を使用して Player を作成します。Username field だけを設定します。その後、設定されていない 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 に正確に何を割り当てるのかを確認できます。

REQUIRED OUTPUT FORMAT: [Your translated content here]

自分で試してみよう

package main

import (
	"fmt"
)

func main() {
	// 入力からユーザー名を読み取る
	var username string
	fmt.Scanln(&username)

	// TODO: 部分的な初期化を使用してPlayerを作成する
	// Usernameフィールドのみを設定し、他のフィールドはゼロ値を使用させる

	// TODO: DisplayProfileメソッドを使用してプレイヤーのプロフィールを表示する
}
quiz icon腕試し

このレッスンには短いクイズがあります。レッスンを始めて解答し、進捗を記録しましょう。

オブジェクト指向プログラミングのすべてのレッスン

自分で練習してみよう: Goオンラインコンパイラ