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

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

Linda Hamilton
リリース: 2024-11-04 07:14:02
オリジナル
726 人が閲覧しました

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

Go の名前付き型アサーションと変換

Go では、名前付き型アサーションと変換により、開発者はカスタム データ型や事前定義されたデータ型を操作できます。ただし、事前定義された型を再定義するカスタム型を扱う場合、誤解が生じる可能性があります。この問題について詳しく見てみましょう。

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

<code class="go">type Answer string

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

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

    // Illegal usage
    acceptMe(ans)

    // Failed type assertion
    acceptMe(ans.(string))

    // Works (but why?)
    acceptMe(string(ans))
}</code>
ログイン後にコピー

Q: 変換中に型アサーション (ans.(string)) が失敗するのはなぜですか(string(ans)) works?

A: 型アサーションは、値が満たせる契約を表すインターフェイス型にのみ適用されます。 Answer のようなカスタム型はインターフェイスではないため、型アサーション構文を使用してカスタム型をアサートしようとするとエラーが発生します。

対照的に、変換では、ある型を別の型に明示的に変換します。 Answer には基礎となる文字列型があるため、変換 (string(ans)) は成功します。 Go は、Ans を acceptMe に渡す前に暗黙的にその基になる文字列に変換します。

補足:

  • Answer のようなカスタム型は、基本的に既存の型のエイリアスです。新しい機能や動作は追加されません。
  • 型アサーションは実行時の型チェックを提供し、変換は暗黙的な型強制を実行します。
  • 事前定義された型をラップするカスタム型を扱う場合は、一般に次の使用をお勧めします。型アサーションの代わりに変換を行う方が効率的であり、基になる型が一致する場合は常に成功します。

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

ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
著者別の最新記事
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート