ホームページ  >  記事  >  バックエンド開発  >  Go のカスタム型の型アサーションと変換の違いは何ですか?

Go のカスタム型の型アサーションと変換の違いは何ですか?

DDD
DDDオリジナル
2024-11-06 10:32:02842ブラウズ

What's the Difference Between Type Assertions and Conversions for Custom Types in Go?

Go における名前付き型アサーションと変換の違いを理解する

Go でカスタム型を扱う場合、名前付き型アサーションと変換の間のニュアンスを理解することが不可欠です。例を使って概念を調べてみましょう。

以下のコード スニペットを考えてみましょう。ここでは、事前定義された文字列型を再定義するカスタム型 Answer を定義します。

<code class="go">type Answer string</code>

次に、Answer を使用してみます。文字列型を予期する関数:

<code class="go">func acceptMe(str string) {
    fmt.Println(str)
}

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

    // Assertion fails: cannot use ans (type Answer) as type string in function argument
    acceptMe(ans)

    // Type assertion fails as well: invalid type assertion: ans.(string) (non-interface type Answer on left)
    acceptMe(ans.(string))

    // Conversion succeeds.
    acceptMe(string(ans))
}</code>

アサーションが失敗する理由

型アサーションはインターフェイスにのみ適用されます。インターフェイスでは、基礎となる型を変えることができます。実際の型を決定するために、Go は型アサーション (x.(T)) または型スイッチ (switch x := x.(type)) を使用します。アサーションは、アサーションが成功したかどうかを示すブール値を返します。

この場合、Answer は固定の基礎となる型 (文字列) を持つ名前付き型です。基礎となる型がわかっているため、アサーションは必要ありません。 string(ans) を使用して Answer タイプを string に変換するだけで十分です。

以上がGo のカスタム型の型アサーションと変換の違いは何ですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

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