LoginSignup
10
1

More than 1 year has passed since last update.

Go 1.18 で追加される `any` は `interface{}` のエイリアス

Last updated at Posted at 2021-12-09

先日、次の Issue を教えてもらって「any って type parameters 専用じゃなかったの?」と驚いたので調べてみました。

結論から書くと Go 1.18 で追加される anyinterface{} のエイリアスとして事前定義された識別子なのでどこでも使えます。
最新の仕様 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 を出力する修正です。

事前定義された識別子である anyinterface{} のエイリアスとして処理するための修正です。

builtin の godoc 4anycomparable を追加する修正です。
ドキュメントには any について次のように記載されています。

any is an alias for interface{} and is equivalent to interface{} in all ways.

なお comparableany と異なり型制約でしか使用できません。

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 日目の記事 で解説されていますので、そちらをご覧ください。

10
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
10
1