web-dev-qa-db-fra.com

Comment créer un champ nullable dans une structure

J'ai du mal à faire un test sur table, et je veux le faire:

testCases := []struct {
    name          string
    testUserID    uint
    expected      User // <- maybe nil
    expectedError error
}

Parce que les valeurs de retour de la fonction testée sont *User, error.

L'utilisateur est comme ça, il est défini comme schéma DB.

type User struct {
  ID uint
  CreatedAt time.Time
  UpdatedAt time.Time
  ...
}

Mais dans ce cas, je ne peux pas faire expected nil.

Comment puis-je faire ceci?

Ou mon approche pour faire un test piloté par table est fausse?

6
Taichi

Pour un champ vide, vous pouvez vérifier les valeurs vides qui sont des valeurs nulles qui ne sont pas nulles en cas de struct.

Lorsque le stockage est alloué pour une variable, soit via une déclaration ou un appel de new, soit lorsqu'une nouvelle valeur est créée, soit via un littéral composite ou un appel de make, et qu'aucune initialisation explicite n'est fournie, la variable ou la valeur est donnée une valeur par défaut. Chaque élément d'une telle variable ou valeur est défini sur la valeur zéro pour son type: false pour les booléens, 0 pour les types numériques, "" pour les chaînes et nil pour les pointeurs, les fonctions, les interfaces, les tranches, les canaux et les cartes.

Dans votre cas, utilisez la structure et non un pointeur vers la structure. La valeur n'est pas nulle, mais elle est vide

var user User
fmt.Println(user == User{}) // will print true

Mais puisque dans votre cas, la valeur renvoyée est un pointeur sur struct *User, error vous pouvez vérifier zéro

var user *User
fmt.Println(user == nil) // will print true

Créez un champ struct qui est un pointeur.

testCases := []struct {
    name          string
    testUserID    uint
    expected      *User // <- maybe nil
    expectedError error
}
5
Himanshu

Les types de base Go ont des valeurs nulles définies et ne peuvent pas être nuls.

Si vous voulez qu'une valeur soit simplement nillable, faites-en un pointeur.

Si vous ne souhaitez pas de comportement de pointeur, vous pouvez utiliser des types Null à partir de packages tiers,

par exemple. https://github.com/guregu/null

par exemple int est implémenté comme:

type Int struct {
    Int   int
    Valid bool
}

une autre solution consiste à écrire votre propre structure avec une valeur nullable

2