Maison >développement back-end >Golang >Comment réaliser des fonctions variadiques génériques sans modèles ?
Argumentation variadique générique dans Go
Go manque de modèles et de fonctions surchargées, mais il offre une solution pour atteindre un semblant de programmation générique en variadique fonctions.
Défi :
De nombreuses fonctions ayant des structures similaires, telles que :
<code class="go">func (this Document) GetString(name string, defaults ...string) string { v, ok := this.GetValueFromDb(name) if !ok { if len(defaults) >= 1 { return defaults[0] } else { return "" } } return v.asString } func (this Document) GetInt(name string, defaults ...int) int { v, ok := this.GetValueFromDb(name) if !ok { if len(defaults) >= 1 { return defaults[0] } else { return 0 } } return v.asInt } // etc. for various types</code>
Solution :
L'utilisation du type interface{} active une fonction générique :
<code class="go">func (this Document) Get(name string, defaults ...interface{}) interface{} { v, ok := this.GetValueFromDb(name) if !ok { if len(defaults) >= 1 { return defaults[0] } else { return nil } } return v }</code>
La fonction GetValueFromDb doit également renvoyer une interface{}. Dans le code client, les valeurs peuvent être converties et obtenues à l'aide de l'assertion de type :
<code class="go">value := document.Get("index", 1).(int) // Panics if the value is not an int</code>
ou
<code class="go">value, ok := document.Get("index", 1).(int) // ok is false if the value is not an int</code>
Bien que cela entraîne une certaine surcharge d'exécution, la restructuration du code et la séparation des fonctions peuvent être plus efficaces. .
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!