Menu
Coddy logo textTech

空のインターフェース

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

これまで、特定のメソッドを必要とするインターフェースを扱ってきましたが、Go には非常に柔軟な特別なインターフェースがあります。それが、interface{} と記述される空のインターフェースです。

空のインターフェースにはメソッドの要件がまったくないため、Go のあらゆる type が自動的にそれを満たします。すべての type は(少なくとも)0 個のメソッドを実装するため、あらゆる type を interface{} 変数に代入できます。

var anything interface{}
anything = 42        // int
anything = "hello"   // string
anything = true      // bool
anything = []int{1, 2, 3}  // slice

このため、interface{} は、未知の、または変動する型の data を扱う必要がある場合に非常に便利です。設定ファイルの読み取り、ユーザーの input の処理、あるいは状況に応じて異なる型の data を返す API の操作を行うときに、このような場面に遭遇することがあります。

ただし、空のインターフェースは任意の型を保持できるため、その値を意味のある形で使用する前に、実際にどの type が格納されているのかを判断する必要があることがよくあります。ここで、型アサーションと型スイッチ(次に学習します)が、interface{} の値を安全に扱うための重要なツールになります。

challenge icon

チャレンジ

簡単

このチャレンジでは、さまざまな型の値を処理できるデータプロセッサを作成し、空のインターフェースの扱いを練習します。interface{}パラメータを受け取り、さまざまなデータ型を処理する関数を作成します。

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

  • データ型を表す文字列(例:"int""string""bool"、または "slice"
  • 実際の値を表す文字列(例:"42""hello""true"、または "1,2,3"

あなたのタスク:

  1. processDataという名前の関数を作成し、interface{}パラメータを受け取って値に関する情報を出力する
  2. データ型の入力に基づいて、値の文字列を適切なGoの型に変換する:
    • "int"の場合:整数に変換する
    • "string"の場合:文字列として使用する
    • "bool"の場合:ブール値に変換する
    • "slice"の場合:カンマ区切りの値を整数のスライスに変換する
  3. 変換した値を使ってprocessData関数を呼び出す
  4. processData内で、値とその型を次の形式で出力する:"Value: [value], Type: [type]"

スライスの入力では、"1,2,3"のようなカンマ区切りの文字列を[]int{1, 2, 3}に変換します。この関数はinterface{}を受け取るため、任意の型で動作し、空のインターフェースがあらゆる型の値を保持できることを示します。fmt.Printf%vおよび%Tのフォーマット動詞を使用して、それぞれ値と型を表示してください。

自分で試してみよう

package main

import (
	"fmt"
)

func main() {
	// 入力を読み取る
	var dataType string
	var valueStr string
	fmt.Scanln(&dataType)
	fmt.Scanln(&valueStr)
	
	// TODO: 以下にコードを書いてください
	// 1. interface{} を受け取る processData 関数を作成する
	// 2. dataType に基づいて valueStr を適切な型に変換する
	// 3. 変換した値で processData を呼び出す
	
}
quiz icon腕試し

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

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

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