Go練習問題3-12:型スイッチを理解しよう

記事内に商品プロモーションを含む場合があります

Go言語の初心者向け問題3-12:型スイッチを理解しよう

この問題を解くために必要な知識:
レベル1~2の知識関数の定義と呼び出し関数の戻り値と複数の戻り値関数の可変長引数無名関数(匿名関数)クロージャ構造体の定義とコンストラクタ関数構造体の埋め込みメソッドの定義とレシーバインターフェース型アサーション型スイッチ

<<前の問題 問題集Top 次の問題>>

Go言語の文法「型スイッチ」とは





ここでは型スイッチの意味や使い方を復習します。必要ない方はここをクリックして練習問題へ飛びましょう。

Go言語には、「型スイッチ」と呼ばれる便利な機能があります。この機能を使うと、インターフェース型の変数が実際にどの型を持っているのかを判別し、それに応じた処理を行うことができます。

今回は、型スイッチについて初心者向けにわかりやすく説明します。

型スイッチとは?

型スイッチは、Go言語で提供されている機能で、あるインターフェース型の変数がどの具体的な型を持っているかを確認し、その型に応じて異なる処理を行うことができます。

通常のswitch文と似ていますが、比較対象がデータの型である点が特徴です。

型スイッチの使い方

以下は型スイッチの基本的な使い方です。

switch v := i.(type) {
case int:
    fmt.Println("整数です:", v)
case string:
    fmt.Println("文字列です:", v)
default:
    fmt.Println("不明な型です")
}

ここでは、iというインターフェース型の変数が、どの具体的な型を持っているかを調べています。そして、int型であれば「整数です」と出力し、string型であれば「文字列です」と出力します。

もしどちらでもない場合、defaultとして「不明な型です」と表示します。

なぜ型スイッチを使うのか?

型スイッチを使うと、プログラムがさまざまな型のデータを受け取ることができ、それぞれの型に応じた処理を簡単に実装できます。

例えば、ある関数がinterface{}型の引数を受け取り、その中で異なる型のデータに対して異なる操作を行う場合、型スイッチが非常に有用です。

実際のコード例

以下に型スイッチを使った簡単な例を示します。

package main

import "fmt"

func checkType(i interface{}) {
    switch v := i.(type) {
    case int:
        fmt.Printf("これは整数です: %d\n", v)
    case string:
        fmt.Printf("これは文字列です: %s\n", v)
    case bool:
        fmt.Printf("これは真偽値です: %t\n", v)
    default:
        fmt.Println("不明な型です")
    }
}

func main() {
    checkType(42)
    checkType("こんにちは")
    checkType(true)
    checkType(3.14)
}

このプログラムでは、checkType関数に渡された値の型を型スイッチでチェックし、それに応じて異なるメッセージを出力しています。実行結果は以下のようになります。

これは整数です: 42
これは文字列です: こんにちは
これは真偽値です: true
不明な型です

まとめ

型スイッチは、インターフェース型の変数が持つ具体的な型を確認し、その型に応じた処理を行うための非常に強力なツールです。

Go言語のプログラムで異なる型のデータを柔軟に扱いたい場合に、この機能を活用してみましょう。 ​

Go練習問題3-12:型スイッチを使ってデータ型を判定しよう

与えられたデータがどの型であるかを判定し、それに応じて異なるメッセージを表示するプログラムを作成しましょう。

このプログラムでは、型スイッチを使って、int型、string型、[]int型(整数スライス)の3つの型に対応し、それ以外の型については「不明な型」として処理します。

この問題の要件

以下の要件に従ってコードを完成させてください。

  1. checkTypeという名前の関数を作成し、interface{}型の引数を受け取ること。
  2. checkType関数の中で、型スイッチを使って以下の処理を行うこと:
    • 引数がint型の場合、その値を「整数型の値:」と共に表示すること。
    • 引数がstring型の場合、その値を「文字列型の値:」と共に表示すること。
    • 引数が[]int型(整数スライス)の場合、その値を「整数スライスの値:」と共に表示すること。
    • それ以外の型の場合は、「不明な型です」と表示すること。
  3. main関数の中で、checkType関数を使用して異なる型の値を渡し、それぞれに応じたメッセージを表示すること。

ただし、以下のような実行結果となるコードを書くこと。

*****↓↓正解コードの実行結果の例↓↓*****

整数型の値: 42
文字列型の値: こんにちは
整数スライスの値: 
不明な型です

この問題を解くヒント

1からコードを組み立てることが難しい場合は、以下のヒントを開いて参考にしましょう。

ヒント1【コードの構成を見る】

正解のコードは上から順に以下のような構成となっています。

1.import
 1-1. fmtパッケージのインポート

2.main関数
 2-1. checkType関数の呼び出し
  2-1-1. 整数型データを渡して処理
  2-1-2. 文字列型データを渡して処理
  2-1-3. 整数スライス型データを渡して処理
  2-1-4. 未知の型データを渡して処理

3.checkType関数
 3-1. interface{}型の引数を受け取る
 3-2. 型スイッチを使用して型を判定
  3-2-1. int型の場合、整数型の値を出力
  3-2-2. string型の場合、文字列型の値を出力
  3-2-3. []int型の場合、整数スライスの値を出力
  3-2-4. その他の型の場合、「不明な型です」と出力

ヒント2【穴埋め問題にする】

以下のコードをコピーし、コメントに従ってコードを完成させて下さい。

package main

import "fmt"

// 型を判定して処理を行う関数
func checkType(i interface{}) {
    /* 【穴埋め問題1】
    ここに型スイッチを使ってiの型を判定し、それぞれの型に応じた処理を行うコードを書いてください。
    */
}

func main() {
    // さまざまな型のデータをcheckType関数に渡して処理する
    checkType(42)            // 整数型
    checkType("こんにちは") // 文字列型
    checkType([]int{1, 2, 3}) // 整数スライス
    checkType(3.14)          // 不明な型
}

 

このヒントを見てもまだ回答を導き出すのが難しいと感じる場合は、先に正解のコードと解説を見て内容を理解するようにしましょう。

解答例と解説

この問題の一つの正解例とそのコードの解説を以下に示します。

正解コードの例

例えば以下のようなプログラムが考えられます。

package main

import "fmt"

// 型を判定して処理を行う関数
func checkType(i interface{}) {
    switch v := i.(type) {
    case int:
        fmt.Printf("整数型の値: %d\n", v)
    case string:
        fmt.Printf("文字列型の値: %s\n", v)
    case []int:
        fmt.Printf("整数スライスの値: %v\n", v)
    default:
        fmt.Println("不明な型です")
    }
}

func main() {
    // さまざまな型のデータをcheckType関数に渡して処理する
    checkType(42)            // 整数型
    checkType("こんにちは") // 文字列型
    checkType([]int{1, 2, 3}) // 整数スライス
    checkType(3.14)          // 不明な型
}

正解コードの解説

今回のGoコードでは、型スイッチを使って渡されたデータの型を判定し、その型に応じた処理を行っています。このコードがどのように動作するのか、ブロックごとに解説します。

import

import "fmt"

この行では、Goの標準ライブラリからfmtパッケージをインポートしています。

fmtパッケージは、フォーマット済みの入出力関数を提供し、このコードでは文字列やデータをコンソールに出力するために使用します。

main関数

func main() {
    // さまざまな型のデータをcheckType関数に渡して処理する
    checkType(42)            // 整数型
    checkType("こんにちは") // 文字列型
    checkType([]int{1, 2, 3}) // 整数スライス
    checkType(3.14)          // 不明な型
}

main関数は、Goプログラムのエントリーポイントです。この関数では、checkType関数を呼び出して、異なるデータ型の値を渡し、それぞれの型に応じた処理が行われます。

checkType関数

func checkType(i interface{}) {
    switch v := i.(type) {
    case int:
        fmt.Printf("整数型の値: %d\n", v)
    case string:
        fmt.Printf("文字列型の値: %s\n", v)
    case []int:
        fmt.Printf("整数スライスの値: %v\n", v)
    default:
        fmt.Println("不明な型です")
    }
}

この関数は、interface{}型の引数を受け取ります。interface{}型は、Go言語においてどんな型でも受け取ることができる特殊な型です。

checkType関数内では、型スイッチを使ってこの引数の具体的な型を判定し、型に応じた処理を行います。

  • 型スイッチの説明:型スイッチは、switch v := i.(type)という構文で書かれます。これにより、iが実際にどの型を持っているのかを判定し、その型に応じた処理を行います。
    • case int:では、iが整数型の場合、その値を出力します。
    • case string:では、iが文字列型の場合、その値を出力します。
    • case []int:では、iが整数スライス型の場合、そのスライスの値を出力します。
    • default:では、上記の型に一致しない場合、「不明な型です」と表示します。

まとめ

このコードでは、Go言語の型スイッチを使って、渡されたデータの型を動的に判定し、それぞれの型に応じた処理を行います。

型スイッチは、インターフェース型の変数がどの具体的な型を持っているかを確認し、適切な処理を実行するために非常に便利です。

今回のコードを通じて、型スイッチの基本的な使い方を理解し、異なるデータ型を柔軟に扱えるようにしましょう。

<<前の問題 問題集Top 次の問題>>

この問題への質問・コメント

この問題を作成するにあたりAIを活用しています。

問題ないことは確認していますが、もし間違いや表現の違和感などありましたら、ご指摘頂けると大変助かります。






    Go練習問題集へ戻る
    トップページへ戻る