問題:
データ構造を反復処理するにはどうすればよいですか(配列またはマップ) の正確な知識がなくても、Go でtype?
失敗した試行:
以下のコードは、マップまたは配列を表すインターフェイスを反復処理し、各項目に対して関数を実行しようとしますが、失敗します。型チェックのため
func DoTheThingToAllTheThings(data_interface interface{}) int { var numThings int switch data := data_interface.(type) { case map[interface{}]interface{}: numThings = len(data) // ... case []interface{}: numThings = len(data) // ... default: fmt.Println("uh oh!") } return numThings }
解決策:
fmt.Printf("%vn", data_interface) 関数は、型を使用せずにデータ構造を反復処理する方法を提供します。 Casting.
func PrintData(data_interface interface{}) { fmt.Printf("%v\n", data_interface) }
これは、fmt.Printf の %v 動詞がリフレクションを使用しているため機能します。
Go のリフレクション:
fmt.Printf 関数は、内部で Reflect パッケージを使用して、引数の型を検査します。引数を入力し、それをフォーマットする方法を決定します。 reflect.ValueOf(arg) は引数の実際の値を表すreflect.Value オブジェクトを返し、reflect.TypeOf(arg) は値の型を返します。
例:
次のコードは Board 構造体を反映し、それを同じ新しい変数に再構成します。 type.
type Board struct { Tboard [9]string Player1 Player Player2 Player } func main() { myBoard := makeBoard() v := reflect.ValueOf(*myBoard) t := v.Type() var b2 Board b2 = v.Interface().(Board) fmt.Printf("v converted back to: %#v\n", b2) }
注:
リフレクションを使用するには、データ構造の型をエクスポートする必要があります。つまり、大文字で始まる必要があります。
以上がGo で未知のデータ構造を反復するにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。