Go言語の型アサーションとは何ですか?

青灯夜游
リリース: 2023-01-12 10:57:31
オリジナル
5100 人が閲覧しました

Go 言語では、型アサーションはインターフェイス値に対して使用される操作です。インターフェイス型変数が保持する値が、期待されるインターフェイスまたは特定の型を実装しているかどうかを確認するために使用されます。構文は "value, ok" です。 := x.(T)」。型アサーションを通じてできること: 1. i が nil かどうかを確認する; 2. i に格納されている値が特定の型であるかどうかを確認する。

Go言語の型アサーションとは何ですか?

このチュートリアルの動作環境: Windows 7 システム、GO バージョン 1.18、Dell G3 コンピューター。

アサーションとは何ですか?

アサーションは、ブール式として表現されるプログラミング用語です。コードを書くとき、私たちは常にいくつかの仮定を立てますが、アサーションはこれらの仮定をコード内で捉えるために使用されます。アサーションを簡単に理解すると、判断を意味します。したがって、Go では、型アサーションを型判断として理解できます。

型アサーションの概要

型アサーション (型アサーション) は、インターフェイスの型変数が保持する値が実装されているかどうかを確認するためにインターフェイスの値に対して使用される操作です。目的のインターフェイスまたは特定のタイプ。

Go 言語における型アサーションの構文形式は次のとおりです。

value, ok := x.(T)
ログイン後にコピー

このうち、x はインターフェイスの型を表し、T は特定の型 (インターフェイスの型でも構いません) を表します。 )。

このアサーション式は、x の値 (つまり value) とブール値 (つまり ok) を返します。このブール値を使用して、x が T 型であるかどうかを判断できます。

  • T が特定の型の場合、型アサーションは x の動的型が特定の型 T と等しいかどうかをチェックします。チェックが成功すると、型アサーションは型が T である x の動的値を返します。

  • T がインターフェイス型の場合、型アサーションは x の動的型が T を満たすかどうかをチェックします。チェックが成功した場合、x の動的値は抽出されず、戻り値は T 型のインターフェイス値になります。

  • 型 T が何であっても、x が nil インターフェイス値の場合、型アサーションは失敗します。

Go

  • 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
ログイン後にコピー

Second

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

# です。
    ##値が switch-case の対応する型と一致しない場合、デフォルトの分岐が選択されます
  • [関連する推奨事項:
  • ビデオ チュートリアルをご覧ください
  • ,
  • プログラミング教育
]

以上がGo言語の型アサーションとは何ですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

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