Maison  >  Article  >  développement back-end  >  La différence entre le pointeur de structure et le transfert de valeur de structure dans les fonctions Golang

La différence entre le pointeur de structure et le transfert de valeur de structure dans les fonctions Golang

WBOY
WBOYoriginal
2024-05-31 19:43:59944parcourir

Dans Go, les paramètres de fonction peuvent être transmis par valeur ou par pointeur. La transmission de valeur transmet une copie et les modifications apportées à la copie n'affecteront pas la valeur d'origine ; la transmission de pointeur transmet l'adresse et les modifications apportées au contenu seront reflétées dans la valeur d'origine. En pratique, le passage de pointeurs peut être utilisé pour optimiser le code, par exemple lors du tri de tranches. Choisir la bonne méthode de livraison est essentiel pour optimiser votre code et améliorer les performances.

Golang 函数中 struct 指针与 struct 值传递的区别

Passage de paramètres de fonction dans Go : passage de valeur et passage de pointeur

Dans Go, les paramètres de fonction peuvent être transmis par passage de valeur ou de pointeur. Comprendre la différence entre ces deux méthodes de livraison est crucial pour maîtriser la programmation Go.

Pass-by-value

Pass-by-value signifie qu'une fonction reçoit une copie de la valeur de l'argument entrant. Toute modification de la valeur du paramètre n'affectera pas la valeur d'origine. Par exemple :

func changeValue(s string) {
    s = "modified"
}

func main() {
    var s = "original"
    changeValue(s)
    fmt.Println(s) //输出: original
}

Dans la fonction changeValue, s est une copie du type string. Les modifications apportées à s n'affectent pas la variable s d'origine dans la fonction main. changeValue 函数中,sstring 类型的副本。对 s 的修改不会影响 main 函数中的原始 s 变量。

指针传递

指针传递是指函数接收传入参数的地址。对参数内容的任何修改都会反映在原始变量中。例如:

func changePointer(s *string) {
    *s = "modified"
}

func main() {
    var s = "original"
    changePointer(&s)
    fmt.Println(s) //输出: modified
}

changePointer 函数中,s 是指向原始 string 变量 s 的指针。对 *s 的修改会直接修改 main 函数中的原始 s 变量。

实战案例

以下是一个利用指针传递在实际场景中进行代码优化的示例:

type Person struct {
    Name string
    Age  int
}

func sortByName(people []Person) {
    for i := 0; i < len(people)-1; i++ {
        for j := i + 1; j < len(people); j++ {
            if people[i].Name > people[j].Name {
                // 交换 people[i] 和 people[j]
                people[i], people[j] = people[j], people[i]
            }
        }
    }
}

func main() {
    people := []Person{
        {"Alice", 20},
        {"Bob", 25},
        {"Charlie", 30},
    }
    sortByName(people)
    fmt.Println(people) //输出: [{Alice 20} {Bob 25} {Charlie 30}]
}

在这个示例中,sortByName 函数接收一个 Person

Passage de pointeur

Le passage de pointeur signifie que la fonction reçoit l'adresse du paramètre entrant. Toute modification du contenu du paramètre sera reflétée dans la variable d'origine. Par exemple :

rrreee

Dans la fonction changePointer, s est un pointeur vers la variable string d'origine s. Les modifications apportées à *s modifient directement la variable s d'origine dans la fonction main. 🎜🎜🎜Cas pratique🎜🎜🎜Ce qui suit est un exemple d'utilisation du passage de pointeur pour l'optimisation de code dans un scénario réel : 🎜rrreee🎜Dans cet exemple, la fonction sortByName reçoit un Person Pointeur vers la tranche. En passant un pointeur, cette fonction peut modifier directement le contenu de la tranche sans créer de copie. Cela améliore l'efficacité de la fonction, surtout lorsque les tranches sont grandes. 🎜🎜🎜Conclusion🎜🎜🎜Comprendre la différence entre le passage par valeur et le passage par pointeur est crucial pour écrire efficacement des programmes Go. Le passage par valeur convient lorsqu'une copie doit être modifiée plutôt que la valeur d'origine, tandis que le passage par pointeur convient lorsque la valeur d'origine doit être modifiée. Choisir la méthode de livraison adaptée à vos besoins peut optimiser votre code et améliorer les performances de votre 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