空のインターフェース
CoddyのGOジャーニー「論理とフロー」セクションの一部。レッスン 16/68。
これまで、特定のメソッドを必要とするインターフェースを扱ってきましたが、Goには非常に柔軟な特別なインターフェースがあります。それが、interface{}と書く空インターフェースです。Go 1.18以降は、interface{}とまったく同じ意味を持つ組み込みのエイリアスであるanyとも書けます。
空のインターフェースにはメソッドの要件がまったくないため、Goのどの型も自動的にそれを満たします。すべての型は(最低でも)メソッドを1つも実装しないので、どの型もinterface{}型の変数に代入できます。
var anything interface{}
anything = 42 // int
anything = "hello" // string
anything = true // bool
anything = []int{1, 2, 3} // sliceこれにより、型が不明または変化するデータを扱う必要があるときに、interface{}が非常に便利になります。設定ファイルの読み込み、ユーザー入力の処理、状況に応じて異なるデータ型を返すAPIの利用などで、このようなケースに遭遇することがあります。
ただし、空のインターフェースにはあらゆる型を格納できるため、その値を適切に使用するには、内部に実際にどの型が格納されているのかを判断する必要があることがよくあります。ここで、型アサーションと型スイッチ(次に学びます)が、interface{} の値を安全に扱うための不可欠なツールになります。
チャレンジ
簡単このチャレンジでは、さまざまな型の値を処理できるデータプロセッサを作成しながら、空のインターフェースの使い方を練習します。interface{}パラメーターを受け取り、さまざまなデータ型を処理する関数を作成します。
次の2つの入力が与えられます。
- データ型を表す文字列(例:
"int"、"string"、"bool"、または"slice") - 実際の値を表す文字列(例:
"42"、"hello"、"true"、または"1,2,3")
あなたのタスクは次のとおりです。
interface{}パラメーターを受け取り、値に関する情報を出力するprocessDataという名前の関数を作成する- データ型の入力に基づいて、値の文字列を適切なGoの型に変換する:
"int"の場合:整数に変換する"string"の場合:文字列として使用する"bool"の場合:真偽値に変換する"slice"の場合:カンマ区切りの値を整数のスライスに変換する
- 変換した値を使って
processData関数を呼び出す processData内で、値とその型を次の形式で出力する:"Value: [value], Type: [type]"
スライスの入力では、"1,2,3"のようなカンマ区切りの文字列を[]int{1, 2, 3}に変換します。この関数はinterface{}を受け取るため、どのような型でも処理できます。これは、空のインターフェースが任意の型の値を保持できることを示しています。値と型をそれぞれ表示するには、%vおよび%Tの書式指定子を使ってfmt.Printfを使用してください。
自分で試してみよう
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オンラインコンパイラ