先日、次の Issue を教えてもらって「any って type parameters 専用じゃなかったの?」と驚いたので調べてみました。
結論から書くと Go 1.18 で追加される any
は interface{}
のエイリアスとして事前定義された識別子なのでどこでも使えます。
最新の仕様 1 にも次のように記載されています。
For convenience, the predeclared type any is an alias for the empty interface.
型制約のための any (2021 年 1 月 12 日~)
Go でジェネリクスをサポートするための仕様変更は 2021 年 1 月 12 日に提案されました。
(実際にはそれ以前に Go2 としての提案やデザインドラフトが公開されています)
この時点での any
はすべての型を受け付ける型制約 (type constraint) です。
The new predeclared name any is a type constraint that permits any type.
interface{}
は結果的にすべての型を表しているだけなので、より明確な意味を持つ識別子として any
が定義されたようです。
同時に型制約において interface{}
と any
は交換可能 (どちらを使っても同じ) であるとされています。
また、 proposal ドキュメント 2 では事前定義された識別子としての any
を型制約以外では使えないものとして定義しています。
It will not be valid to use any as anything other than a type constraint.
この proposal はジェネリクスサポートに焦点を絞っているため any
を他の場所でも使えるようにするかどうかについては別に議論する必要があるというのがその理由です。
型制約以外でも使えるように (2021 年 9 月 23 日~)
any
を型制約以外の場所でも使えるようにする変更は Go2 としての提案時点で行われていました。
賛成意見も反対意見もあったようですがジェネリクスとともに導入されることが 2021 年 9 月 23 日に決まりました。 3
導入の理由については次のコメントで説明されています。
関連する修正
any
を型制約以外の場所でも使えるようにする修正です。
Go 仕様に any
についての説明が追加されました。
ジェネリクスが有効な場合は runtime のコンパイル時に事前定義された識別子として any
を出力する修正です。
事前定義された識別子である any
を interface{}
のエイリアスとして処理するための修正です。
builtin
の godoc 4 に any
と comparable
を追加する修正です。
ドキュメントには any
について次のように記載されています。
any is an alias for interface{} and is equivalent to interface{} in all ways.
なお comparable
は any
と異なり型制約でしか使用できません。
comparable is an interface that is implemented by all comparable types (booleans, numbers, strings, pointers, channels, interfaces, arrays of comparable types, structs whose fields are all comparable types). The comparable interface may only be used as a type parameter constraint, not as the type of a variable.
既存コードへの影響はないのか?
あくまでも事前定義された識別子であり、予約語ではないため既存コードへの影響はないようです。
例えば type any = interface{}
という定義を自分で行っていたり、 any
という変数を使用していてもそれは事前定義された any
をシャドウイングするだけとのことです。 5 6
とはいえ Linter に怒られて CI が失敗するとかはあるかもしれません。
any の使い方
(2021 年 12 月 18 日追記)
any
はどのように使えばいいのか、どういった場合に使うべきかについては syumai さんによる 12 日目の記事 で解説されていますので、そちらをご覧ください。
-
https://github.com/golang/proposal/blob/135750a71111d228b1b5c552b20eacb227a663be/design/43651-type-parameters.md#the-any-constraint ↩
-
https://github.com/golang/go/issues/33232#issuecomment-925303192 ↩
-
https://github.com/golang/go/issues/33232#issuecomment-925202264 ↩
-
https://github.com/golang/go/issues/33232#issuecomment-925205036 ↩