Go 言語では、型アサーションはインターフェイス値に対して使用される操作です。インターフェイス型変数が保持する値が、期待されるインターフェイスまたは特定の型を実装しているかどうかを確認するために使用されます。構文は "value, ok" です。 := x.(T)」。型アサーションを通じてできること: 1. i が nil かどうかを確認する; 2. i に格納されている値が特定の型であるかどうかを確認する。
このチュートリアルの動作環境: Windows 7 システム、GO バージョン 1.18、Dell G3 コンピューター。
アサーションは、ブール式として表現されるプログラミング用語です。コードを書くとき、私たちは常にいくつかの仮定を立てますが、アサーションはこれらの仮定をコード内で捉えるために使用されます。アサーションを簡単に理解すると、判断を意味します。したがって、Go では、型アサーションを型判断として理解できます。
型アサーション (型アサーション) は、インターフェイスの型変数が保持する値が実装されているかどうかを確認するためにインターフェイスの値に対して使用される操作です。目的のインターフェイスまたは特定のタイプ。
Go 言語における型アサーションの構文形式は次のとおりです。
value, ok := x.(T)
このうち、x はインターフェイスの型を表し、T は特定の型 (インターフェイスの型でも構いません) を表します。 )。
このアサーション式は、x の値 (つまり value) とブール値 (つまり ok) を返します。このブール値を使用して、x が T 型であるかどうかを判断できます。
Variable.(type) には、型アサーションの主な形式が 2 つあります。例: i.(int)
変数、ブール = 変数.(型)。例: num,ok = i.(int)。 ok は、タイプが成功したかどうかを判断することを意味します。
型アサーションの使用法
型アサーションを使用して次のことを行うことができますi が nil かどうかを確認します
具体的な使用方法は 2 つあります:
t := i.(T)
この式はインターフェイス オブジェクトをアサートできます (i) Itは nil ではなく、インターフェイス オブジェクト (i) に格納されている値の型は T です。アサーションが成功すると、値は t に返されます。アサーションが失敗すると、パニックがトリガーされます。 コードを書いてテストしましょう
package main import "fmt" func main() { var i interface{} = 10 t1 := i.(int) fmt.Println(t1) fmt.Println("=====分隔线=====") t2 := i.(string) fmt.Println(t2) }
実行後の出力は次のとおりです。2 番目のアサーションの実行時に失敗し、パニックがトリガーされたことがわかります
10 =====分隔线===== panic: interface conversion: interface {} is int, not string goroutine 1 [running]: main.main() E:/GoPlayer/src/main.go:12 +0x10e exit status 2
必要に応じて、アサートされたインターフェイス値は nil なので、期待どおりにパニックをトリガーするかどうかを確認してみましょう
package main func main() { var i interface{} // nil var _ = i.(interface{}) }
出力は次のとおりです。実際にパニックをトリガーします
panic: interface conversion: interface is nil, not interface {} goroutine 1 [running]: main.main() E:/GoPlayer/src/main.go:5 +0x34 exit status 2
t, ok:= i.(T)
上記と同様に、この式はインターフェイス オブジェクト (i) が nil ではなく、インターフェイス オブジェクト (i) に格納されている値の型が T であることをアサートすることもできます。が成功すると、それが返されます。その型は t で、この時点では ok の値は true であり、アサーションが成功したことを示します。 インターフェイス値の型がアサートした T ではない場合、アサーションは失敗しますが、最初の式とは異なり、パニックは引き起こされませんが、 ok の値が false に設定され、アサーションが失敗し、t はこの時点の T のゼロ値です。
上記の例を次のように少し変更します
package main import "fmt" func main() { var i interface{} = 10 t1, ok := i.(int) fmt.Printf("%d-%t\n", t1, ok) fmt.Println("=====分隔线1=====") t2, ok := i.(string) fmt.Printf("%s-%t\n", t2, ok) fmt.Println("=====分隔线2=====") var k interface{} // nil t3, ok := k.(interface{}) fmt.Println(t3, "-", ok) fmt.Println("=====分隔线3=====") k = 10 t4, ok := k.(interface{}) fmt.Printf("%d-%t\n", t4, ok) t5, ok := k.(int) fmt.Printf("%d-%t\n", t5, ok) }
実行後の出力は次のとおりです。2 番目のアサーションが実行されたとき、失敗したにもかかわらず、トリガーされなかったことがわかります。パニック。
10-true =====分隔线1===== -false =====分隔线2===== <nil> - false =====分隔线3===== 10-true 10-true
上記の出力では、
-falseより前の 2 番目のアサーションの出力は、t2 出力の値があるかどうかではなく、アサーションが失敗したためであることに注意する必要があります。したがって、t2 が取得するのは、文字列のゼロ値も
"" であり、長さはゼロであるため、その出力は表示されません。 型スイッチ
package main import "fmt" func findType(i interface{}) { switch x := i.(type) { case int: fmt.Println(x, "is int") case string: fmt.Println(x, "is string") case nil: fmt.Println(x, "is nil") default: fmt.Println(x, "not type matched") } } func main() { findType(10) // int findType("hello") // string var k interface{} // nil findType(k) findType(10.23) //float64 }
10 is int hello is string <nil> is nil 10.23 not type matched
追加説明:
値が nil の場合、一致はcase nil
# です。
[関連する推奨事項: 以上がGo言語の型アサーションとは何ですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。