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 Il est exposé et a 2 champs que j'aimerais tous les deux Pour être spécifié lorsque le alors je peux importer et l'utiliser dans ma fonction principale comme ceci: p> foo code> défini comme celui-ci dans un package: p> foo code> struct est créé. p> ./prog.go:18:13: not enough arguments in call to NewFoo
have (string)
want (string, string)
3 Réponses :
Comment masquer le constructeur de type par défaut à Golang? P> blockQuote>
vous
ne peut pas fort> pour un type exporté. P> s'y habituer, ce n'est pas un problème dans la vie réelle. P>
(Pour les types non plus, il suffit de fournir un
func newunexportedtype (...) inintégrétype code>.) p>
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"} code>, 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.
Efficace Go P>
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. P> blockQuote>
Nous devons souvent modifier la définition de type, comme l'ajout de plus de champs p> blockQuote>
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. P>
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. P>
Exemple: - P> < Pré> xxx pré>
de cette manière, tout l'appelant sera en mesure d'y accéder, mais ne peut pas créer FOO sans fonction Newfoo. P> P>
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 b>. Un
foo {} code> sans champ spécifié ne devrait pas simplement imploser; Si c'est le cas, c'est un défaut de la conception defoo code>. 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.