Go での名前付き型のアサーションと変換
事前定義された型を再定義するためにカスタム型が定義される次のシナリオを考えてみましょう。
<code class="go">type Answer string</code>
次に、元の定義済み型を受け入れる関数でこのカスタム型を使用してみます。
<code class="go">func acceptMe(str string) { fmt.Println(str) } func main() { type Answer string var ans Answer = "hello" // Type assertion fails acceptMe(ans.(string)) // Conversion works acceptMe(string(ans)) }</code>
型アサーション ans.(string) はエラーで失敗します。 : 無効なタイプ アサーション: ans.(string) (非インターフェイス タイプの回答が左側)。一方、変換文字列(ans)は成功します。この動作により、次のような疑問が生じます。
なぜ型アサーションは失敗するのに、変換は機能するのですか?
これを理解するために、型アサーションはインターフェイスに対してのみ機能することを明確にしましょう。インターフェイスには任意の基礎となる型を含めることができるため、型アサーションと型スイッチが不可欠になります。型アサーションは、アサーションの成功を示す結果とともにブール値を返します。
対照的に、カスタム型 Answer には、固定の基礎となる型 (文字列) があります。正確な型はすでにわかっているので、Answer から string への変換は常に成功するため、型アサーションは必要ありません。この変換の構文は string(ans).
です。以上がGo のカスタム型では型アサーションが失敗するのに変換が機能するのはなぜですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。