Maison >développement back-end >Golang >Comment puis-je faire la différence entre les valeurs par défaut et les valeurs zéro définies explicitement dans les structures Go ?

Comment puis-je faire la différence entre les valeurs par défaut et les valeurs zéro définies explicitement dans les structures Go ?

DDD
DDDoriginal
2024-12-04 17:20:15975parcourir

How Can I Differentiate Between Default and Explicitly Set Zero Values in Go Structs?

Valeurs par défaut et distinction des champs non initialisés dans Go

Dans Go, les types primitifs ont des valeurs par défaut. Par exemple, les entiers (int) sont initialisés à 0. Cependant, lorsque vous travaillez avec des structures, faire la distinction entre une valeur 0 et un champ non initialisé peut être difficile.

Par exemple, considérez le code ci-dessous :

package main

import "log"

type test struct {
    testIntOne int
    testIntTwo int
}

func main() {
    s := test{testIntOne: 0}

    log.Println(s)
}

Dans ce code, testIntOne et testIntTwo valent zéro. Cependant, testIntOne a été explicitement défini sur 0, tandis que testIntTwo a été initialisé par la valeur par défaut. Cette ambiguïté peut prêter à confusion dans la détermination des champs qui ont été explicitement définis.

Est-il possible de faire la distinction entre ces deux cas ?

Non, Go ne suit pas si un champ a été défini ou non. Par conséquent, il est impossible de savoir si une valeur nulle est le résultat d'une initialisation ou d'une affectation intentionnelle.

Solutions de contournement

  • Utilisez des pointeurs : Les pointeurs ont une valeur nulle, vous pouvez donc vérifier si un pointeur a été défini en examinant s'il est néant.
type test struct {
    testIntOne *int
    testIntTwo *int
}
  • Créer une méthode Setter : Vous pouvez créer une méthode pour définir la valeur d'un champ et savoir si elle a été définie.
type test struct {
    testIntOne int
    testIntTwo bool // Tracks if testIntTwo has been set
}

func (t *test) SetTestIntTwo(val int) {
    t.testIntTwo = val
    t.isSetTestIntTwo = true
}

func main() {
    s := test{}
    s.SetTestIntTwo(0)
    fmt.Println(s.isSetTestIntTwo) // Output: true
}

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