Comment définir les valeurs par défaut dans les structures Go

Il y a plusieurs réponses / techniques à la question ci-dessous:

  1. Comment définir les valeurs par défaut pour les structures golang?
  2. Comment initialiser des structures dans golang

J’ai quelques réponses mais une discussion plus approfondie est nécessaire.

Une idée possible consiste à écrire une fonction constructeur séparée

//Something is the structure we work with type Something struct { Text ssortingng DefaultText ssortingng } // NewSomething create new instance of Something func NewSomething(text ssortingng) Something { something := Something{} something.Text = text something.DefalultText = "default text" return something } 
  1. Force une méthode pour obtenir la structure (la manière du constructeur).

Une bonne conception consiste à rendre votre type non exporté, mais fournissez une fonction de constructeur exscope comme NewMyType () dans laquelle vous pouvez correctement initialiser votre structure / type. Renvoie également un type d’interface et non un type concret, et l’interface doit contenir tout ce que les autres veulent faire avec votre valeur. Et votre type concret doit implémenter cette interface bien sûr.

Cela peut être fait simplement en rendant le type lui-même non exporté. Vous pouvez exporter la fonction NewSomething et même les champs Text et DefaultText, mais n’exportez simplement pas le type de structure

  1. Une autre façon de le personnaliser pour votre propre module consiste à utiliser une structure de configuration pour définir les valeurs par défaut (option 5 dans le lien).

Un problème avec l’option 1 de la réponse de Victor Zamanian est que si le type n’est pas exporté, les utilisateurs de votre paquet ne peuvent pas le déclarer comme type pour les parameters de la fonction. struct par exemple

 package candidate // Exporting interface instead of struct type Candidate interface {} // Struct is not exported type candidate struct { Name ssortingng Votes unit32 // Defaults to 0 } // We are forced to call the constructor to get an instance of candidate func New(name ssortingng) Candidate { return candidate{name, 0} // enforce the default value here } 

Ce qui nous permet de déclarer des types de parameters de fonction à l’aide de l’interface Candidate exscope. Le seul inconvénient que je puisse voir de cette solution est que toutes nos méthodes doivent être déclarées dans la définition de l’interface, mais vous pouvez dire que c’est une bonne pratique de toute façon.

De https://golang.org/doc/effective_go.html#composite_literals :

Parfois, la valeur zéro n’est pas assez bonne et un constructeur d’initialisation est nécessaire, comme dans cet exemple, dérivé du paquetage os.

  func NewFile(fd int, name ssortingng) *File { if fd < 0 { return nil } f := new(File) f.fd = fd f.name = name f.dirinfo = nil f.nepipe = 0 return f } 
 type Config struct { AWSRegion ssortingng `default:"us-west-2"` }