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
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.
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
函数中,s
是 string
类型的副本。对 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 fonctionchangePointer
, 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!