ホームページ  >  記事  >  バックエンド開発  >  Go のカスタム型では型アサーションが失敗するのに変換が機能するのはなぜですか?

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

Susan Sarandon
Susan Sarandonオリジナル
2024-11-04 08:41:30872ブラウズ

Why Does Type Assertion Fail But Conversion Work with Custom Types in Go?

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

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。