Go - Chamada por referência

o call by referenceO método de passar argumentos para uma função copia o endereço de um argumento para o parâmetro formal. Dentro da função, o endereço é usado para acessar o argumento real usado na chamada. Isso significa que as alterações feitas no parâmetro afetam o argumento passado.

Para passar o valor por referência, ponteiros de argumento são passados ​​para as funções como qualquer outro valor. Da mesma forma, você precisa declarar os parâmetros da função como tipos de ponteiro, como na seguinte funçãoswap(), que troca os valores das duas variáveis ​​inteiras apontadas por seus argumentos.

/* function definition to swap the values */
func swap(x *int, y *int) {
   var temp int
   temp = *x    /* save the value at address x */
   *x = *y      /* put y into x */
   *y = temp    /* put temp into y */
}

Para saber mais sobre ponteiros na programação Go, consulte Go - Ponteiros.

Por enquanto, vamos chamar a função swap () passando valores por referência como no exemplo a seguir -

package main

import "fmt"

func main() {
   /* local variable definition */
   var a int = 100
   var b int = 200

   fmt.Printf("Before swap, value of a : %d\n", a )
   fmt.Printf("Before swap, value of b : %d\n", b )

   /* calling a function to swap the values.
   * &a indicates pointer to a ie. address of variable a and 
   * &b indicates pointer to b ie. address of variable b.
   */
   swap(&a, &b)

   fmt.Printf("After swap, value of a : %d\n", a )
   fmt.Printf("After swap, value of b : %d\n", b )
}
func swap(x *int, y *int) {
   var temp int
   temp = *x    /* save the value at address x */
   *x = *y    /* put y into x */
   *y = temp    /* put temp into y */
}

Coloque o código acima em um único arquivo Go e, em seguida, compile e execute-o. Produz o seguinte resultado -

Before swap, value of a :100
Before swap, value of b :200
After swap, value of a :200
After swap, value of b :100

Mostra que a mudança também se refletiu fora da função, ao contrário da chamada por valor, em que as mudanças não refletem fora da função.