-2
votes

Comment masquer le constructeur de type par défaut à Golang?

La raison pour laquelle j'ai cette question est que je fais souvent des erreurs que j'ai oublié de spécifier une valeur au champ d'une structure, le compilateur va bien, mais la valeur zéro provoque des bugs.

Voici un exemple. Dis que j'ai un type foo code> défini comme celui-ci dans un package: p> xxx pré>

Il est exposé et a 2 champs que j'aimerais tous les deux Pour être spécifié lorsque le foo code> struct est créé. p>

alors je peux importer et l'utiliser dans ma fonction principale comme ceci: p>

./prog.go:18:13: not enough arguments in call to NewFoo
    have (string)
    want (string, string)

go

1 commentaires

Vous ne pouvez pas. Rappelez-vous, en allez, l'une des règles clés du pouce est de faire des valeurs zéro utilisables . Un foo {} sans champ spécifié ne devrait pas simplement imploser; Si c'est le cas, c'est un défaut de la conception de foo . Jetez un coup d'œil à la bibliothèque standard; Il est plein de bons exemples de la façon de faire un bon type d'aller.


3 Réponses :


3
votes

Comment masquer le constructeur de type par défaut à Golang?

vous ne peut pas pour un type exporté.

s'y habituer, ce n'est pas un problème dans la vie réelle.

(Pour les types non plus, il suffit de fournir un func newunexportedtype (...) inintégrétype .)


4 commentaires

C'est en fait un problème très courant, car nous devons souvent modifier la définition de type, comme l'ajout de plus de champs, puis j'ai oublié de mettre à jour l'appelant quelque part pour spécifier la valeur manquante, finissez par causer un bug.


Chaque fois que je vois un & foo {exigefield1: "fff"} , je suis très nerveux, car je ne sais pas si cela inclut tous les champs obligatoires.


@Leozhang, si vous ajoutez un champ à un type de structure d'une manière qui enfreint vos affaires lorsqu'il a la valeur zéro, vous avez fait un changement de rupture. Ne fais pas ça (TM). Ajoutez plutôt un nouveau type. Voir "La règle de compatibilité des importations" . Mais vraiment la règle globale est celle des valeurs zéro utiles.


Merci pour les réponses.



1
votes

Efficace Go

Il est utile d'organiser lors de la conception de vos structures de données que la La valeur zéro de chaque type peut être utilisée sans autre initialisation.


Nous devons souvent modifier la définition de type, comme l'ajout de plus de champs

C'est pourquoi vous devriez rendre la valeur zéro pour les champs de structure significatifs. Le comportement est par conception. Par exemple, il est utilisé pour maintenir la garantie de compatibilité Go 1.


0 commentaires

1
votes

Vous pouvez éviter ce problème en faisant de type FOO inutilisé.

Vous pouvez faire une interface exportée et dispose de toutes les méthodes que le type FOO fonctionne.

Exemple: - < Pré> xxx

de cette manière, tout l'appelant sera en mesure d'y accéder, mais ne peut pas créer FOO sans fonction Newfoo.


0 commentaires