ホームページ >バックエンド開発 >Golang >Go の「型アサーション」アプローチの背後にある理由は何ですか?

Go の「型アサーション」アプローチの背後にある理由は何ですか?

王林
王林転載
2024-02-06 08:12:07970ブラウズ

Go 的“类型断言”方式背后的原因是什么?

質問内容

golang の型アサーションは、具体的な型ではなく、インターフェイス型として明示的に定義された変数にのみ適用されるという事実を理解しようとしています。 "string"、"int32") など)。

これは私の混乱の根本原因を示す簡単なコード例です:

リーリー この質問のタイトルが示すように、インターフェイス型に対してのみ型アサーションを実装し、そのインターフェイスを明示的に実装する変数に割り当てられた基になる値が内部的に指定した値であるかどうかを確認する背後にある理由が理解できません。"(t)"アサーションメソッド。このため、「型アサーション」は意図しない誤った呼び名であると考えられます。つまり、すべての型に適用されますが、インターフェイス型にのみ適用されるという意味です。

つまり、この言語設計の決定の背後には明らかに理由があるに違いなく、それは golang の慣用的な書き方と関係があるのではないかと思いますが、この問題に関する大量のリソースを見てきましたが、理由を決して指定しないでください。

これが私にとって意味がある理由は、Go プログラムが何らかのインターフェース (動作) を表すすべての変数を使って書かれた方が「より良い (明示的なインターフェース定義はオプションであるため)」べきであるため、明示的なインターフェースを定義するのは理にかなっているからです。明確さと読みやすさを目的として、変数について説明します。

しかし、前述したように、「型アサーション」機能が go に実装されている理由を具体的に説明しているリソースを見たことがありません。この混乱を解消するのに役立てていただければ幸いです。

-- 更新 1 - 質問を明確にするために何かを追加します:

私の中心的な質問は、型アサーションが変数のインターフェイスが明示的に実装されている場合にのみ機能し、インターフェイスが暗黙的に実装されている場合には機能しない理由 (理解できません) に関するものだと思います。

"whateverfunction" で示されているように、コード は、"newrect" が "shape" インターフェイスを実装するか、または ""shape" インターフェイスの実装であることを考慮します (そうでない場合、関数はただし、型アサーション ".(t)" メソッド の背後にあるコードは、 "newrect" を "shape" インターフェイスの実装として扱いません。

したがって、golang でのインターフェース実装に関する考慮事項の違いがある場合、そのような設計上の決定の背後には理由 (差別化) があるはずだと思います。

だからこそ、私が今のところ思いつく唯一の理由は、これが何らかの方法で人々に go コードを書かせる方法であるかどうかである、と述べたのです。


正解


Burak Serdarの回答をチェックしてください。より簡潔で役に立つかもしれません。それでも、最終的に私にとって「ピンと来た」一連の推論全体を投稿します:

|-> インターフェイスは、受信すると予想されるデータの正確な種類がわからない場合に使用されます (たとえば、プログラム内の関数の同じパラメーターが、次のような結果として異なる種類のデータを受信する可能性があるため)ユーザー入力) ですが、提供されたデータが持つべき正確な動作はわかっています。

^^ したがって、インターフェイスに格納される値の実際の型はコンパイル時には不明です。 (そうでない場合は、明らかにコード内で指定することになります。)

| -> したがって、型アサーションを取得して、実行中にプログラムが提供すると予想される値の観点からプログラムの動作を定義できるようにします。

|-> したがって、型アサーションは、インターフェイス型として明示的に指定された変数にのみ適用され、同じインターフェイスを実装する可能性があるがインターフェイス型として明示的に指定されていない変数には適用されません

######のため######

プログラムに送信されるデータの正確な型がわからないため、インターフェイスを使用する場合にのみこの型アサーションが必要になります。この型アサーションはインターフェイスを使用する場合にのみ必要となるため、型アサーションは機能するだけですインターフェイス型として明示的に指定された型の場合、他のすべての場合はデータ型が既知であるため (コンパイラーは、関係するデータのすべてのデータ型をすでに知っているため、変数がインターフェイスを実装していると暗黙的に想定できます)、必要はありません。既知の型のデータに対して型アサーションを使用することはできません。

以上がGo の「型アサーション」アプローチの背後にある理由は何ですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事はstackoverflow.comで複製されています。侵害がある場合は、admin@php.cn までご連絡ください。