空のインターフェース
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{} の値を安全に扱うための重要なツールになります。
チャレンジ
簡単このチャレンジでは、さまざまな型の値を処理できるデータプロセッサを作成し、空のインターフェースの扱いを練習します。interface{}パラメータを受け取り、さまざまなデータ型を処理する関数を作成します。
2つの入力を受け取ります:
- データ型を表す文字列(例:
"int"、"string"、"bool"、または"slice") - 実際の値を表す文字列(例:
"42"、"hello"、"true"、または"1,2,3")
あなたのタスク:
processDataという名前の関数を作成し、interface{}パラメータを受け取って値に関する情報を出力する- データ型の入力に基づいて、値の文字列を適切なGoの型に変換する:
"int"の場合:整数に変換する"string"の場合:文字列として使用する"bool"の場合:ブール値に変換する"slice"の場合:カンマ区切りの値を整数のスライスに変換する
- 変換した値を使って
processData関数を呼び出す 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 を呼び出す
}このレッスンには短いクイズがあります。レッスンを始めて解答し、進捗を記録しましょう。
論理とフローのすべてのレッスン
自分で練習してみよう: Goオンラインコンパイラ