Maison >développement back-end >Golang >Exemples de transmission de valeur go et de transmission d'adresses

Exemples de transmission de valeur go et de transmission d'adresses

藏色散人
藏色散人avant
2020-10-30 15:00:202350parcourir
Vous trouverez ci-dessous

Tutoriel Golang colonne pour présenter l'exemple de transmission de valeur GO et de transmission d'adresse, j'espère que cela sera utile aux amis dans le besoin !

Exemples de transmission de valeur go et de transmission d'adresses

Regardons d'abord un exemple simple

1 Ajoutez un & devant la variable pour indiquer l'adresse du. variable (c'est-à-dire ce pointeur vers la variable), l'ajout de * devant la variable du pointeur indique la valeur correspondant à ce pointeur (comprenez par vous-même)

//main.gopackage main
func ByAss() {
  s := 100
  p := &s  // s 的地址给了p

  fmt.Println(*p) //100 所以p对应的值变成了100
  *p += 100
  fmt.Println(*p)  //200
  fmt.Println(s) //200 p和s相同的地址,所以s也变成200}//demo.gopackage main
func main() {
  ByAss()}
Go par défaut passe les paramètres par valeur, c'est-à-dire en passant une copie du paramètre. Une fois que la fonction a reçu une copie du paramètre, la valeur de la copie peut être modifiée lors de l'utilisation de la variable, mais cela n'affectera pas la variable d'origine, telle que Function(arg1).

2. Passage de valeur ordinaire (faites attention à cet exemple, cela semble très simple, mais il est facile de l'ignorer)

func ByValue1(n1 int) {
  //此时n1 是n 的一个拷贝,所以地址不一样
  fmt.Println(&n1)//0xc00000a098}package main
func main() {
  n := 100
  fmt.Println(&n) //0xc00000a090
  ByValue1(n)//传递副本}
Si vous voulez que la fonction soit directement modifiez la valeur du paramètre, et au lieu d'opérer sur une copie du paramètre, vous devez transmettre l'adresse du paramètre (ajouter l'esperluette devant le nom de la variable, telle que &variable) à la fonction. référence, telle que Function(&arg1). À ce stade, ce qui est transmis à la fonction est un pointeur.

3. Si vous souhaitez utiliser l'adresse pour passer

func main() {
    n := 100
    fmt.Println(&n) //0xc00000a090
    ByReference(&n) //传递指针
    fmt.Println(n) //200}//注意函数 参数类型需要是用指针符号(*)func ByReference(n1 *int) {

   *n1 += 100
   fmt.Println(n1)//0xc00000a090 地址与n相同, 所以n值被改变了
  //注意
  //ip := &n1//这个写法有问题,表示地址的地址
  //fmt.Println(ip)}

4. Regardez le tableau

(a) tableau Il est également passé par valeur
arr := [5]int{1,3,5,6,7}arrByValue(&arr) //也需要使用& 符号fmt.Println(arr) //[100 300 5 6 7]func arrByValue(arr1 *[5]int) {
 arr2 := arr1
 arr2[0] = 100
 arr2[1] = 300}

5 Ce qui suit est un exemple de découpage (le tableau de variables est passé par référence
func main() {
    arr := []int{1,3,5,6,7}
    bbb(arr) //没有使用& 符号
    fmt.Print(arr[0])// 11 结果已经改变,说明数组是地址传递

    //就算不通过函数,也是引用传递
    //arr := []int{1,3,5,6,7}
    //arr2 := arr
    //arr2[1] = 0
    //fmt.Print(arr)//[1 0 5 6 7]}//aaafunc bbb(arr1 []int) {
   arr1[0] += 10}
).

(b) in Lorsqu'une fonction est appelée, les types de référence tels que les tranches, les dictionnaires, les cartes, les interfaces et les canaux sont passés par référence par défaut (même si le pointeur n'est pas explicitement signalé).

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:
Cet article est reproduit dans:. en cas de violation, veuillez contacter admin@php.cn Supprimer