Maison  >  Article  >  développement back-end  >  Qu’est-ce que l’affirmation Golang ?

Qu’est-ce que l’affirmation Golang ?

爱喝马黛茶的安东尼
爱喝马黛茶的安东尼original
2019-12-10 09:37:233129parcourir

Qu’est-ce que l’affirmation Golang ?

Il existe une grammaire dans le langage Go qui permet de déterminer directement s'il s'agit d'une variable de ce type : valeur, ok = élément.(T), où valeur est la valeur du variable, et ok est un type booléen, element est la variable d'interface et T est le type affirmé.

Si l'élément stocke une valeur de type T, alors ok renvoie vrai, sinon il renvoie faux.

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)
}

Sortie :

The value is  {456 56 <nil>}

Il est également courant d'utiliser switch pour affirmer :

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")
    }
}

Sortie :

It is a Order and its value is {456 56 <nil>}

Le langage golang fournit la fonction d'assertion. Tous les programmes de Golang implémentent l'interface{}, ce qui signifie que tous les types tels que les types string, int, int64 et même les types de structure personnalisés ont l'interface{}. Cette approche est similaire à celle de Java. Le type Object est relativement similaire. Ensuite, lorsqu'une donnée est transmise via func funcName(interface{}), cela signifie que le paramètre est automatiquement converti en type d'interface{}.

Par exemple, le code suivant :

func funcName(a interface{}) string {
     return string(a)
}

Le compilateur retournera :

cannot convert a (type interface{}) to type string: need type assertion

À ce stade, cela signifie que l'ensemble du processus de conversion nécessite une assertion de type. Les assertions de type ont les formes suivantes :

L'assertion directe utilise

var a interface{}
fmt.Println("Where are you,Jonny?", a.(string))

, mais si l'assertion échoue, la panique se produira généralement. Ainsi, afin d’éviter la panique, nous devons porter certains jugements avant d’affirmer.

value, ok := a.(string)

Si l'assertion échoue, la valeur de ok sera fausse, mais si l'assertion réussit, la valeur de ok sera vraie et la valeur obtiendra la valeur correcte attendue. Exemple :

value, ok := a.(string)
if !ok {
    fmt.Println("It&#39;s not ok for type string")
    return
}
fmt.Println("The value is ", value)

De plus, vous pouvez également utiliser l'instruction switch pour porter un jugement :

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
}

De plus, ajoutez quelques conseils pour la programmation en langage Go :

( 1) Si cela ne répond pas aux exigences, vous pouvez revenir aussi vite que possible et réduire l'utilisation des instructions else, qui peuvent être plus intuitives.

(2) Lors de la conversion du type, s'il s'agit d'une chaîne, il n'est pas nécessaire d'affirmer. Utilisez la fonction fmt.Sprint() pour obtenir l'effet souhaité.

(3) Les variables peuvent être définies et déclarées en groupes, tels que :

var (
   a string
   b int
   c int64
   ...
)
import (
    "fmt"
    "strings"
    "net/http"
   ...
)

(4) La logique de la fonction est relativement complexe et une partie de la logique peut être encapsulée dans une fonction pour améliorer la lisibilité. .

(5) Les fonctions qui utilisent le package net/http et le package net/url peuvent avoir une fonction d'encodage d'URL, vous devez donc y faire attention.

Le site Web PHP chinois propose un grand nombre de tutoriels d'introduction à Golang gratuits, tout le monde est invité à apprendre !

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Déclaration:
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn