4.2 あらゆる型のデータを格納するany

Goは静的な型付け言語であり、一部に例外はあるものの、最終的には変数やデータの型を定義する必要があります。しかしサーバーから渡ってくるデータの解析など、たまに型情報が未知のデータをそのまま変数に入れたいことがあります。そのためのany型がGo 1.18から導入予定です。

anyの実体はinterface{}のエイリアスです。Goではインタフェースを使うことで、要件にあうメソッドを持つインスタンスを代入できる変数を定義できます。メソッド定義のない空インタフェース(empty interface)は、メソッドの制約がなにもなくなるため、あらゆるデータを保存できる変数になります。

Go 1.18から導入ということは、1.19が出て1.17がサポート外になるその日までは過去のバージョンとの互換性を保つために、ライブラリで使われる機会は限定的となるでしょう。しばらくはinterface{}という記法も残り続けると思いますし、過去のドキュメントやコードを読むためにもinterface{}という書き方を頭の片隅に入れておくと良いでしょう。

	// interface{}型はAny型
	var v any = "なんでも入る変数"
	// 整数も入る
	v = 1
	// 浮動小数点数も入る
	v = 3.141592

どの言語であっても型の恩恵を受けるために、anyのような型は原則として使わない方が良いでしょう。しかし、たとえばどのような情報がやってくるのか事前にわからないJSONの分析などに役立ちます。JSONのキーは必ず文字列でなければなりません。そのため、次のコードのようにmap[string]anyを利用して、最上位がオブジェクトになっているJSON(世の中にあるJSONのほとんどはそうなっているはず)を、 ...