ホームページ >バックエンド開発 >Golang >Go の型アサーションが型エイリアスを使用すると失敗するのはなぜですか?

Go の型アサーションが型エイリアスを使用すると失敗するのはなぜですか?

Barbara Streisand
Barbara Streisandオリジナル
2024-12-16 05:47:12321ブラウズ

Why Does Go's Type Assertion Fail with Type Aliases?

Go で型エイリアスにキャストするには?

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

package main

import "fmt"

type somethingFuncy func(int) bool

func funcy(i int) bool {
    return i%2 == 0
}

func main() {
    var a interface{} = funcy

    _ = a.(func(int) bool)  // Works

    fmt.Println("Awesome -- apparently, literally specifying the func signature works.")

    _ = a.(somethingFuncy)  // Panics

    fmt.Println("Darn -- doesn't get here. But somethingFuncy is the same signature as func(int) bool.")
}

最初の型アサーションは、明示的に動作する場合に機能します。型を func(int) bool として宣言します。ただし、型エイリアス somethingFuncy を使用する 2 番目の型はパニックになります。

説明

キャストとは異なり、Go の型アサーションは、アサートされる値の実際の型を厳密に比較します。したがって、型エイリアス somethingFuncy は、func(int) bool と同じシグネチャを共有していますが、別個の型とみなされます。

ボーナス

型アサーションは次のコードで実行されます。型が等しいかどうかを比較します:

func main() {
    var a interface{} = funcy

    switch v := a.(type) {
    case func(int) bool:
        // Type successfully asserted as func(int) bool
    case somethingFuncy:
        // Type successfully asserted as somethingFuncy
    default:
        // Type assertion failed
    }
}

型エイリアスを使用すると、正確な型が必要なため、この比較は失敗します。一致します。

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

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