Maison  >  Article  >  développement back-end  >  Comment passer des paramètres indéfinis dans Golang

Comment passer des paramètres indéfinis dans Golang

silencement
silencementoriginal
2019-12-23 10:36:063490parcourir

Comment passer des paramètres indéfinis dans Golang

Paramètres variables de Golang

Le paramètre variable est un espace réservé Vous pouvez attribuer un ou plusieurs paramètres à cet espace réservé, donc peu importe le nombre réel de paramètres pouvant être gérés. par paramètres variables

. Jetons un coup d'œil à la déclaration des paramètres variables :

func Printf(format string, a ...interface{}) (n int, err error)
func Println(a ...interface{}) (n int, err error)

Les paramètres variables utilisent le nom...Type La déclaration formelle est dans la liste des paramètres de la fonction, et elle doit être le dernier paramètre de la liste des paramètres, ce qui est similaire aux autres langues ;

Les paramètres de la variable seront convertis en type []Type correspondant dans la fonction, afin que nous puissions obtenir les paramètres transmis à la fonction comme lors de l'utilisation de slice

Une chose à noter est que les paramètres variables de Golang n'ont pas besoin de forcer l'apparition de paramètres liés.

Par exemple, je souhaite implémenter une fonction sum qui additionne tous les entiers en langage C :

int sum(int num, ...) {
    // todo
}

Nous ne pouvons l'utiliser que si nous spécifions d'abord au moins un paramètre formel fixe (num). .. Il n'est pas nécessaire de faire cela en golang pour les paramètres variables :

func sum(nums ...int) int {
    //todo
}

C'est aussi l'une des incarnations de la syntaxe concise de golang.

Passer des paramètres à...Paramètres variables

Il existe deux formes de transmission de paramètres à des fonctions avec des paramètres variables. La première n'est pas différente du passage de paramètres habituel. dans une section :

sum(1, 2, 3)
sum(1, 2, 3, 4, 5, 6, 7, 8, 9, 10)

C'est la même chose qu'un appel de fonction ordinaire sauf que le nombre de paramètres change dynamiquement.

La deuxième forme consiste à utiliser l'opérateur... pour passer des paramètres sous la forme d'une variable..., la variable ici doit être une tranche du même type que le paramètre variable, et ne peut pas être autre types (oui,

les tableaux ne sont pas autorisés), regardez un exemple :

numbers := []int{1, 2, 3, 4, 5, 6, 7, 8, 9, 10}
sum(numbers...) // 和sum(1, 2, 3, 4, 5, 6, 7, 8, 9. 10)等价

L'emplacement le plus courant pour ce formulaire est dans la fonction intégrée append :

result := []int{1, 3}
data := []int{5, 7, 9}
result = append(result, data...) // result == []int{1, 3, 5, 7, 9}

Est-il compatible avec python ? L'opération de déballage est très similaire, oui, dans la plupart des cas, vous pouvez traiter l'opérateur... comme l'opération de déballage de Golang, mais il y a quelques différences à noter

 :

Tout d'abord, vous ne pouvez utiliser que l'opérateur... pour le type de tranche :

arr := [...]int{1, 2, 3, 4, 5}
sum(arr...) // 编译无法通过

Vous verrez un message d'erreur comme celui-ci :

cannot use arr (type [5]int) as type []int in argument to sum

C'est parce que le paramètre variable est en fait une tranche,... L'opérateur est du sucre syntaxique. Il copie la tranche précédente directement dans le paramètre variable, au lieu de la décompresser en n paramètres indépendants puis de les transmettre

C'est pourquoi. Je dis seulement... La raison pour laquelle le .operator ressemble à unpack.

La deuxième chose à noter est que vous ne pouvez pas mélanger des passages de paramètres indépendants et... des opérateurs. Regardons un autre exemple :

slice := []int{2, 3, 4, 5}
sum(1, slice...) // 无法通过编译

Cette fois, vous verrez un message d'erreur relativement long : <.>

too many arguments in call to sum
    have (number, []int...)
    want (...int)

C'est pour la même raison que celle mentionnée précédemment. L'opérateur... remplace directement le paramètre variable par slice, ce qui fait que le paramètre précédent donné indépendamment n'est plus compté comme paramètre variable dans la plage <.>

, la liste des paramètres de la fonction passe de (...int) à (int, ...int), ce qui provoque finalement une incompatibilité de type de fonction et un échec de compilation.

La bonne approche est également très simple. Ne mélangez pas et n'utilisez pas... d'opérateurs pour transmettre des paramètres à des paramètres variables.

Après avoir lu cet article et établi quelques connexions simples, je pense que vous serez en mesure de maîtriser l'utilisation des paramètres variables 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!

Déclaration:
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn