Go 言語には、この型の変数であるかどうかを直接判断できる文法があります: value, ok = element.(T)。ここで、value は、変数、ok は bool 型、element はインターフェイス変数、T はアサートされた型です。
要素が型 T の値を格納する場合、ok は true を返し、それ以外の場合は false を返します。
package main import ( "fmt" ) type Order struct { ordId int customerId int callback func() } func main() { var i interface{} i = Order{ ordId: 456, customerId: 56, } value, ok := i.(Order) if !ok { fmt.Println("It's not ok for type Order") return } fmt.Println("The value is ", value) }
出力:
The value is {456 56 <nil>}
switch を使用してアサートすることも一般的です:
package main import ( "fmt" ) type Order struct { ordId int customerId int callback func() } func main() { var i interface{} i = Order{ ordId: 456, customerId: 56, } switch value := i.(type) { case int: fmt.Printf("It is an int and its value is %d\n", value) case string: fmt.Printf("It is a string and its value is %s\n", value) case Order: fmt.Printf("It is a Order and its value is %v\n", value) default: fmt.Println("It is of a different type") } }
出力:
It is a Order and its value is {456 56 <nil>}
Golang の言語にはアサーション関数が用意されています。 golang のすべてのプログラムはインターフェース{}を実装しています。つまり、string、int、int64、さらにはカスタム構造体タイプなどのすべての型がインターフェース{}を持っています。このアプローチは Java のアプローチと似ています。オブジェクト型は比較的似ています。データの一部が func funcName(interface{}) を介して渡されると、パラメータは自動的にinterface{} の型に変換されることになります。
たとえば、次のコード:
func funcName(a interface{}) string { return string(a) }
コンパイラは次の値を返します:
cannot convert a (type interface{}) to type string: need type assertion
この時点では、変換プロセス全体で型アサーションが必要であることを意味します。型アサーションの形式は次のとおりです。
直接アサーションは
var a interface{} fmt.Println("Where are you,Jonny?", a.(string))
を使用しますが、アサーションが失敗すると、通常、パニックが発生します。したがって、パニックを起こさないためには、主張する前に一定の判断を下す必要があります。
value, ok := a.(string)
アサーションが失敗した場合、ok の値は false になりますが、アサーションが成功した場合、ok の値は true になり、value は期待される正しい値を取得します。例:
value, ok := a.(string) if !ok { fmt.Println("It's not ok for type string") return } fmt.Println("The value is ", value)
さらに、switch ステートメントを使用して判断することもできます:
var t interface{} t = functionOfSomeType() switch t := t.(type) { default: fmt.Printf("unexpected type %T", t) // %T prints whatever type t has case bool: fmt.Printf("boolean %t\n", t) // t has type bool case int: fmt.Printf("integer %d\n", t) // t has type int case *bool: fmt.Printf("pointer to boolean %t\n", *t) // t has type *bool case *int: fmt.Printf("pointer to integer %d\n", *t) // t has type *int }
Go 言語プログラミングのヒントもいくつか追加します:
(1) If要件を満たしていない場合は、できるだけ早く Return し、else ステートメントの使用を減らし、より直感的にすることができます。
(2) 型を変換する際、文字列の場合はアサートする必要がないので、fmt.Sprint()関数を使用すると目的の効果が得られます。
(3) 変数は、次のようなグループで定義および宣言できます。
var ( a string b int c int64 ... ) import ( "fmt" "strings" "net/http" ... )
(4) 関数のロジックは比較的複雑で、読みやすさを向上させるために一部のロジックを関数にカプセル化できます。
(5) net/http パッケージ、net/url パッケージを使用する関数には URL エンコード機能が含まれている場合がありますので注意が必要です。
PHP 中国語 Web サイトには、無料の Golang 入門チュートリアル が多数あり、誰でも学習することができます。
以上がgolang アサーションとは何ですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。