Maison  >  Article  >  développement back-end  >  Utilisation avancée et techniques de passage des paramètres de la fonction Golang

Utilisation avancée et techniques de passage des paramètres de la fonction Golang

WBOY
WBOYoriginal
2024-04-14 08:33:021002parcourir

L'utilisation avancée du passage de paramètres de la fonction Go inclut le passage de pointeur et le passage de référence. Le passage du pointeur transmet un pointeur de variable vers une fonction, permettant à la fonction de modifier directement la variable d'origine. Le passage par référence transmet la variable elle-même à la fonction, évitant ainsi les copies inutiles et modifiant directement la variable d'origine.

Utilisation avancée et techniques de passage des paramètres de la fonction Golang

Utilisation avancée et techniques de transmission des paramètres de fonction en Go

Dans le langage Go, la manière par défaut de transmettre les paramètres de fonction est par valeur, ce qui signifie qu'une copie de la variable passée à la fonction sera copiée à l'intérieur de la fonction . Cependant, le langage Go permet également le passage de pointeurs et de références, ce qui peut éviter des opérations de copie inutiles et permettre aux fonctions de modifier directement les variables transmises par l'appelant.

Passage de pointeur

La syntaxe du passage de pointeur est similaire à celle du passage de valeur, sauf que vous devez ajouter un symbole * avant le type de paramètre. Le passage du pointeur transmet le pointeur du paramètre (une valeur pointant vers l’adresse mémoire de la variable) à la fonction. * 符号。指针传递会将参数的指针(指向变量内存地址的值)传递给函数。

func Increment(n *int) {
    *n++ // 解引用指针并增加指向变量的值
}

实战案例:

让我们编写一个函数 Swap 来交换两个整数的值。使用值传递无法实现交换,因为函数内部对参数所做的修改不会影响调用者传递的原始变量。然而,使用指针传递可以做到这一点。

func Swap(a, b *int) {
    *a, *b = *b, *a // 解引用指针并交换值
}

func main() {
    x, y := 10, 20
    Swap(&x, &y) // 传递指针地址
    fmt.Println(x, y) // 输出:20 10
}

引用传递

引用传递与指针传递类似,不同之处在于引用传递不会复制指针,而是直接将变量本身传递给函数。引用传递的语法与指针传递相同,但类型前不会加上 * 符号。

实战案例:

让我们编写一个函数 UpdateSlice

func UpdateSlice(s []int) {
    for i := range s {
        s[i]++ // 直接修改切片中的元素
    }
}

func main() {
    slice := []int{1, 2, 3}
    UpdateSlice(slice) // 传递引用
    fmt.Println(slice) // 输出:2 3 4
}

Cas pratique :

Écrivons une fonction Swap pour échanger les valeurs​​de deux entiers. L'échange n'est pas possible en utilisant le passage par valeur car les modifications apportées aux paramètres à l'intérieur de la fonction n'affectent pas les variables d'origine transmises par l'appelant. Cependant, cela peut être fait en utilisant le passage de pointeur.

rrreee

Passage par référence🎜🎜Le passage par référence est similaire au passage par pointeur, sauf qu'au lieu de copier le pointeur, le passage par référence transmet directement la variable elle-même à la fonction. La syntaxe du passage par référence est la même que du passage par pointeur, mais les symboles * ne sont pas précédés du type. 🎜🎜Exemple pratique :🎜🎜Écrivons une fonction UpdateSlice pour mettre à jour tous les éléments de la tranche. Cela ne peut pas être accompli efficacement en utilisant le passage par valeur, car les modifications apportées à la tranche à l'intérieur de la fonction n'affectent pas la tranche d'origine transmise par l'appelant. Cependant, l'utilisation du passage par référence évite les copies inutiles et modifie directement la tranche d'origine. Le langage 🎜rrreee🎜Summary🎜🎜Go propose trois méthodes de transmission de paramètres : la transmission de valeurs, la transmission de pointeurs et la transmission de références, qui peuvent répondre aux besoins de différents scénarios. Le passage de pointeur et le passage de référence peuvent éviter des opérations de copie inutiles et permettre aux fonctions de modifier directement les variables transmises par l'appelant. Choisir la méthode de transmission de paramètres appropriée peut améliorer l'efficacité et la lisibilité du programme. 🎜

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