ホームページ  >  記事  >  バックエンド開発  >  golang アサーションとは何ですか?

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

爱喝马黛茶的安东尼
爱喝马黛茶的安东尼オリジナル
2019-12-10 09:37:233125ブラウズ

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

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&#39;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 サイトの他の関連記事を参照してください。

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