57

この遊び場のスニペットを参照してください。

関連コード:

type somethingFuncy func(int) bool

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

var a interface{} = funcy

func main() {

    _ = 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.")
}

最初のキャストは、型を明示的に宣言することによって機能します。しかし、2番目のキャストはパニックに陥ります。なんで?より長い func シグネチャにキャストするクリーンな方法はありますか?

4

4 に答える 4

8

nemoのすばらしい答えを完成させるためinterface{}に、特定の動的タイプ(例:)のインターフェイス(ef、 int)から別のタイプ(例:)に直接ジャンプするtype MyInt intことはできませんが、2つのステップを順番に実行できることに注意してください:

  • 変数の動的な型が期待どおりであることを主張します。
  • そのアサーションの結果を選択した型に変換します。

基になる型はその名前が示すようにdynamicであるため、型アサーションが成功したか失敗したかをテストすることをお勧めします。一方、型変換の正確性はコンパイラによって強制されます。

少し変更した遊び場のスニペットを次に示します: http://play.golang.org/p/FZv06Zf7xi

于 2014-01-13T19:28:38.040 に答える
1

タイプエイリアスはあなたが望むものだと思います。提案は受け入れられ、Go 1.9 に含まれている必要があります。すなわち。

TypeSpec = identifier [ "=" ] Type .

参照
https://github.com/golang/go/issues/18130
https://github.com/golang/proposal/blob/master/design/18130-type-alias.md

于 2017-07-15T10:26:32.540 に答える