Menu
CoddyTech

型スイッチ

CoddyのGOジャーニー「論理とフロー」セクションの一部。レッスン 18/68。

型アサーションは単一の型を確認するのに適していますが、インターフェース変数が複数の型を取り得る場合、それらに対処する必要がよくあります。そんなときに型スイッチが非常に便利です。具体的な型に応じて異なる処理を行うための、すっきりとした方法を提供します。

型スイッチでは、次の特別な構文を使います。switch v := i.(type)。特定の型ではなく、(type)キーワードを使っている点に注目してください。変数vには、各ケースで具体的な型を持つ実際の値が格納されます。

func describe(data interface{}) {
    switch v := data.(type) {
    case int:
        fmt.Printf("Integer: %d\n", v)
    case string:
        fmt.Printf("String: %s\n", v)
    case bool:
        fmt.Printf("Boolean: %t\n", v)
    default:
        fmt.Printf("Unknown type: %T\n", v)
    }
}

どの場合も、vは自動的に正しい型になるため、追加の型アサーションは必要ありません。そのため、複数の型を1か所で処理する必要がある場合、型スイッチを使うと、if-else文で複数の型アサーションを連ねるよりも、はるかにすっきりと書けます。

challenge icon

チャレンジ

簡単

この課題では、型switchを使って通知システム内の複数のデータ型を処理する練習をします。具体的な型に応じてさまざまな種類の通知を処理し、適切な形式に整える関数を作成します。

次の2つの入力を受け取ります。

  • 通知の種類を表す文字列(例:"email"、"sms"、"push"、"alert")
  • 通知の内容または値を表す文字列

あなたの課題は次のとおりです。

  1. interface{}型の引数を受け取る、processNotificationという関数を作成します。
  2. 通知の種類を表す入力に基づいて、内容を適切なGoの型に変換し、interface{}型の変数に格納します。
    • "email"の場合:内容を文字列として使用します。
    • "sms"の場合:内容を整数に変換します(文字数を表します)。
    • "push"の場合:内容をブール値に変換します("enabled"の場合はtrue、それ以外はfalse)。
    • "alert"の場合:内容をfloat64に変換します(優先度を表します)。
  3. 変換した値を使って、processNotification関数を呼び出します。
  4. processNotificationの中で型switchを使って各型を処理し、適切なメッセージを出力します。
    • stringの場合:"Email notification: [value]"
    • intの場合:"SMS notification with [value] characters"
    • boolの場合:"Push notifications: [value]"
    • float64の場合:"Alert with priority: [value]"
    • その他の型の場合:"Unknown notification type"

文字列の変換にはstrconvパッケージを使用します。ブール値への変換では、"enabled"の場合にのみtrueになります。この課題では、型switchを使うと1つの制御構造内で複数の型をすっきりと処理でき、各caseで正しい型の値を自動的に取得できることを学びます。

float64は、fmt.Printlnや%v/%gの書式指定子と同じように、最短の形式で出力してください。3.5は3.5、1.0は1と出力されます(%fの書式指定子では1.000000と出力されます)。

自分で試してみよう

package main

import (
	"fmt"
	"strconv"
)

func main() {
	// 入力を読み取る
	var notificationType string
	var content string
	fmt.Scanln(&notificationType)
	fmt.Scanln(&content)
	
	// TODO: 以下にコードを書く
	// 1. interface{} パラメータを受け取る processNotification 関数を作成する
	// 2. notificationType に基づいて content を適切な型に変換する
	// 3. 変換した値を渡して processNotification を呼び出す
	// 4. processNotification 内で type switch を使用して異なる型を処理する
	
}
quiz icon腕試し

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

論理とフローのすべてのレッスン

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