Go での名前付き型のアサーションと変換
Go でカスタム型を定義する場合、事前定義された型を新しい名前で再定義することができます。ただし、事前定義された型を期待する関数でこれらのカスタム型を使用しようとすると、エラーが発生する可能性があります。これらのエラーの背後にある理由を詳しく調べ、解決策を検討してみましょう。
次のコードを考えてみましょう。
<code class="go">type Answer string func acceptMe(str string) { fmt.Println(str) } func main() { var ans Answer = "hello" // Cannot use ans (type Answer) as type string in function argument acceptMe(ans) // Invalid type assertion: ans.(string) (non-interface type Answer on left) acceptMe(ans.(string)) // Works, but why? acceptMe(string(ans)) }</code>
型アサーションが失敗する理由
型アサーションはインターフェイスに対してのみ機能します。インターフェイスには任意の基礎となる型を含めることができ、型アサーションまたは型切り替えが可能になります。ただし、この場合、Answer は単一の基礎となる型である string を持つカスタム型です。基になる型への変換は成功することが保証されているため、型アサーションは必要ありません。
変換が機能する理由
一方、変換は実行できます。 Answer と string の場合のように、既知の関係がある型の間。構文 string(ans) は、Answer 型を基になる string 型に明示的に変換します。
結論
型アサーションと変換の区別を理解することが重要です。型アサーションは、基になる型を動的にチェックするためにインターフェイスとともに使用する必要があります。一方、変換は、既知の関係を持つ型間で明示的に変換するために使用されます。 Answer と string の場合、基になる型と相互運用するための予測可能かつ明確な方法を提供するため、変換が推奨されるアプローチです。
以上がGo のカスタム型で型アサーションが失敗するのはなぜですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。