Go のカスタム型で型アサーションが失敗するのはなぜですか?

Patricia Arquette
リリース: 2024-11-04 08:49:30
オリジナル
737 人が閲覧しました

Why Does Type Assertion Fail with Custom Types in Go?

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 サイトの他の関連記事を参照してください。

ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
著者別の最新記事
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート
私たちについて 免責事項 Sitemap
PHP中国語ウェブサイト:福祉オンライン PHP トレーニング,PHP 学習者の迅速な成長を支援します!