Renvois de valeurs multiples
Une fonctionnalité très particulière de Go (pour un langage compilé) est que les fonctions et méthodes peuvent renvoyer plusieurs valeurs (Python et Perl fonctionnent également).
Cela peut être utilisé pour améliorer beaucoup de mauvaises conventions dans les programmes C : modifier les paramètres de manière à renvoyer une erreur (par exemple, renvoyer -1 sur EOF). Dans Go, Write renvoie une valeur de comptage et une erreur : "Oui, vous avez écrit quelques octets, mais tous n'ont pas été écrits en raison d'une exception de périphérique".
*File.Write dans le package os est déclaré comme ceci :
func (file *File) Write(b []byte) (n int, err error)
Comme le dit la documentation, il renvoie le nombre d'octets écrits, et lorsque n != len(b) , renvoie une erreur non nulle. Il s’agit d’une approche courante dans Go. Les tuples n'apparaissent pas comme des types natifs, donc plusieurs valeurs de retour peuvent être le meilleur choix. Vous pouvez renvoyer exactement la valeur souhaitée sans avoir à surcharger l'espace du champ avec un signal d'erreur spécifique.
Valeurs de retour nommées
La valeur de retour ou le paramètre de résultat d'une fonction Go peut recevoir un nom et être utilisée comme une variable d'origine, tout comme un paramètre d'entrée. S'ils sont nommés, ils sont initialisés avec la valeur nulle de leur type au début de la fonction. Si la fonction exécute l'instruction return sans ajouter de paramètres, les paramètres de résultat seront renvoyés. Utiliser cette fonctionnalité permet (encore) de faire plus avec moins de code.
Les noms ne sont pas obligatoires, mais ils peuvent rendre le code plus robuste et plus clair : voici la documentation. Par exemple, nommer la valeur de retour nextPos de type int peut indiquer qui représente quel
func nextInt(b []byte, pos int) (value, nextPos int) { /* ... */ }
Puisque les résultats nommés sont initialisés et associés au retour non modifié, ils peuvent être très simples et clairs. Voici un morceau de code io.ReadFull, qui est très bien utilisé :
func ReadFull(r Reader, buf []byte) (n int, err error) { for len(buf) > 0 && err == nil { var nr int nr, err = r.Read(buf) n += nr buf = buf[nr:len(buf)] } return }
Articles et tutoriels connexes recommandés : tutoriel golang
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!