Maison  >  Article  >  développement back-end  >  Pourquoi GOLANG a-t-il encore des pointeurs ?

Pourquoi GOLANG a-t-il encore des pointeurs ?

(*-*)浩
(*-*)浩original
2019-12-31 10:48:563802parcourir

Pourquoi GOLANG a-t-il encore des pointeurs ?

Alors pourquoi Golang a-t-il besoin de pointeurs ? Quelles utilisations uniques ce type de pointeur peut-il avoir ? (Apprentissage recommandé : GO )

Lors de l'apprentissage du langage de caractères, comprenez toujours en premier, lorsqu'une fonction/méthode est transmise. Est-ce une valeur ou une référence.

En fait, dans la plupart des langages de référence, lorsque les paramètres sont de types basiques, la plupart des valeurs transmises sont des valeurs, ce qui signifie qu'une autre copie des paramètres est copiée dans la pile d'appels de fonction actuelle. Lorsque les paramètres sont de types avancés, tous les paramètres transmis sont essentiellement des références. Ceci est principalement dû à la gestion de la mémoire de la machine virtuelle.

La zone mémoire dans la gestion de la mémoire comprend généralement le tas et la pile. La pile est principalement utilisée pour stocker les données de type simple utilisées dans la pile d'appels actuelle : string, boolean, int, float, etc.

Ces types de mémoire occupent une petite quantité et sont faciles à recycler. Fondamentalement, leurs valeurs sont similaires à l'espace occupé par les pointeurs, elles peuvent donc être copiées directement, et c'est plus facile pour GC. pour effectuer une optimisation ciblée.

Les types avancés complexes ont tendance à occuper des quantités de mémoire relativement importantes et sont stockés dans le tas. La fréquence de recyclage du GC est relativement faible et le coût est élevé. Par conséquent, la transmission de références/pointeurs peut éviter des coûts plus élevés. Opérations de copie, économie de mémoire et amélioration de l'efficacité de l'exécution du programme.

Par conséquent, vous pouvez envisager d'utiliser des pointeurs dans les situations suivantes : 1. La valeur d'un paramètre doit être modifiée ; 2. Évitez les opérations de copie ; 3. Économisez de la mémoire ; Dans Golang, les types spécifiquement avancés tels que struct, slice et map sont également différents. En fait, seule l'utilisation de struct est un peu compliquée. Slice, map et chan peuvent tous être utilisés directement, sans se demander s'il s'agit de valeurs ou de pointeurs.

Go a des pointeurs, mais pas d'arithmétique de pointeur. Vous ne pouvez pas utiliser de variables de pointeur pour parcourir les octets d’une chaîne. Lorsque vous appelez des fonctions dans Go, n'oubliez pas que les variables sont transmises par valeur.

Définissez un pointeur '*' en le préfixant avec type : var p * int. Maintenant, p est un pointeur vers une valeur entière. Toutes les variables nouvellement définies se voient attribuer la valeur zéro de leur type, et il en va de même pour les pointeurs. Un pointeur nouvellement défini ou qui ne pointe vers rien a la valeur nulle.

Dans d'autres langues, cela est souvent appelé un pointeur NULL, en Go c'est nil . Pour que le pointeur pointe vers quelque chose, vous pouvez utiliser l'opérateur d'adresse (&), comme ceci :

package main 
 
import "fmt"
 
func main() {
    var p *int 
    fmt.Printf("%v\n",p) //← 打印 nil
 
    var i int //← 定义一个整形变量 i
    p = &i    //← 使得 p 指向 i, 获取 i 的地址
    fmt.Printf("%v\n",p) //打印内存地址
 
    *p = 6
    fmt.Printf("%v\n",*p) //打印6
    fmt.Printf("%v\n",i) //打印6
 
}

Comme mentionné précédemment, il n'y a pas d'arithmétique de pointeur, donc si vous l'écrivez comme ceci : *p++, cela signifie (*p) ++ : obtenez d'abord la valeur pointée par le pointeur, puis ajoutez-en une à cette valeur. Faites attention à la différence avec le langage C ici.

Pour le langage Go, à proprement parler, il n'existe qu'un seul type de transfert, celui de la valeur. Lorsqu'une variable est passée en paramètre, une copie de la variable est créée puis transmise à la fonction ou à la méthode. Vous pouvez voir que l'adresse de cette copie est différente de l'adresse de la variable.

Lorsqu'une variable est passée comme pointeur, un nouveau pointeur est créé qui pointe vers la même adresse mémoire pointée par la variable, vous pouvez donc considérer ce pointeur comme une copie du pointeur de variable d'origine.

Compris de cette façon, on peut comprendre que Go crée toujours une copie et la transfère par valeur, mais cette copie est parfois une copie de la variable et parfois une copie du pointeur de variable.

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