ホームページ >バックエンド開発 >Golang >Go の名前付き型に対して型アサーションが機能しないのはなぜですか?

Go の名前付き型に対して型アサーションが機能しないのはなぜですか?

Patricia Arquette
Patricia Arquetteオリジナル
2024-11-05 04:41:01750ブラウズ

Why Don't Type Assertions Work for Named Types in Go?

Go における型アサーションと変換

Go では、値が指定されたインターフェイスを実装しているかどうかをテストするために名前付き型アサーションが使用されます。ただし、このアプローチは、事前定義された型を新しい名前で再定義する名前付き型には直接適用されません。

次のコードを考えてみましょう。

<code class="go">type Answer string

func acceptMe(str string) {
    fmt.Println(str)
}

func main() {
    type Answer string
    var ans Answer = "hello"

    // Type assertion fails:
    acceptMe(ans.(string))

    // Conversion to underlying type succeeds:
    acceptMe(string(ans))
}</code>

型アサーション ans.(string ) は、Answer タイプが文字列インターフェイスを実装しているかどうかをチェックしようとするため、失敗しますが、実際には実装されていません。代わりに、Answer は文字列を再定義するカスタム型です。

一方、変換 string(ans) は、Answer 値をその基になる文字列型に直接変換するため、成功します。 Answer は文字列の名前付き型であるため、この変換は常に有効です。

型アサーションは名前付き型では機能しないのはなぜですか?

型アサーションは次のように設計されています。インターフェース。インターフェイスには複数の実装 (具象型と呼ばれる) を含めることができ、値がそのインターフェイスを実装しているかどうかを確認するために型アサーションが使用されます。ただし、名前付き型には固定の基礎となる型があり、それはコンパイル時に判明します。したがって、型アサーションは不要であり、名前付き型に対して実行できません。

型アサーションの代わりに変換を使用する場合は?

名前付き型を変換する場合は変換を使用します。型をその基になる型に変換します。これは、特定の型を予期しているが、その基になる型を受け入れることができる関数またはインターフェイスに値を渡す必要がある場合に便利です。

以上がGo の名前付き型に対して型アサーションが機能しないのはなぜですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

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