Go - Dicas

As dicas do Go são fáceis e divertidas de aprender. Algumas tarefas de programação Go são realizadas mais facilmente com ponteiros, e outras tarefas, como chamada por referência, não podem ser executadas sem o uso de ponteiros. Portanto, torna-se necessário aprender dicas para se tornar um programador Go perfeito.

Como você sabe, cada variável é um local da memória e cada local da memória tem seu endereço definido, que pode ser acessado usando o operador E comercial (&), que denota um endereço na memória. Considere o seguinte exemplo, que imprimirá o endereço das variáveis ​​definidas -

package main

import "fmt"

func main() {
   var a int = 10   
   fmt.Printf("Address of a variable: %x\n", &a  )
}

Quando o código acima é compilado e executado, ele produz o seguinte resultado -

Address of a variable: 10328000

Então você entendeu o que é endereço de memória e como acessá-lo. Agora vamos ver o que são ponteiros.

O que são ponteiros?

UMA pointeré uma variável cujo valor é o endereço de outra variável, ou seja, o endereço direto do local da memória. Como qualquer variável ou constante, você deve declarar um ponteiro antes de usá-lo para armazenar qualquer endereço de variável. A forma geral de uma declaração de variável de ponteiro é -

var var_name *var-type

Aqui, typeé o tipo base do ponteiro; deve ser um tipo de dados C válido evar-nameé o nome da variável de ponteiro. O asterisco * que você usou para declarar um ponteiro é o mesmo asterisco que você usa para a multiplicação. No entanto, nesta declaração, o asterisco está sendo usado para designar uma variável como um ponteiro. A seguir estão as declarações de ponteiro válidas -

var ip *int        /* pointer to an integer */
var fp *float32    /* pointer to a float */

O tipo de dados real do valor de todos os ponteiros, seja inteiro, flutuante ou outro, é o mesmo, um número hexadecimal longo que representa um endereço de memória. A única diferença entre ponteiros de diferentes tipos de dados é o tipo de dados da variável ou constante para a qual o ponteiro aponta.

Como usar ponteiros?

Existem algumas operações importantes, que frequentemente realizamos com ponteiros: (a) definimos variáveis ​​de ponteiro, (b) atribuímos o endereço de uma variável a um ponteiro e (c) acessamos o valor no endereço armazenado na variável de ponteiro .

Todas essas operações são realizadas utilizando o operador unário * que retorna o valor da variável localizada no endereço especificado por seu operando. O exemplo a seguir demonstra como realizar essas operações -

package main

import "fmt"

func main() {
   var a int = 20   /* actual variable declaration */
   var ip *int      /* pointer variable declaration */

   ip = &a  /* store address of a in pointer variable*/

   fmt.Printf("Address of a variable: %x\n", &a  )

   /* address stored in pointer variable */
   fmt.Printf("Address stored in ip variable: %x\n", ip )

   /* access the value using the pointer */
   fmt.Printf("Value of *ip variable: %d\n", *ip )
}

Quando o código acima é compilado e executado, ele produz o seguinte resultado -

Address of var variable: 10328000
Address stored in ip variable: 10328000
Value of *ip variable: 20

Pontos nulos em Go

O compilador Go atribui um valor Nil a uma variável de ponteiro no caso de você não ter o endereço exato a ser atribuído. Isso é feito no momento da declaração da variável. Um ponteiro que é atribuído nil é chamado denil ponteiro.

O ponteiro nil é uma constante com valor zero definido em várias bibliotecas padrão. Considere o seguinte programa -

package main

import "fmt"

func main() {
   var  ptr *int

   fmt.Printf("The value of ptr is : %x\n", ptr  )
}

Quando o código acima é compilado e executado, ele produz o seguinte resultado -

The value of ptr is 0

Na maioria dos sistemas operacionais, os programas não têm permissão para acessar a memória no endereço 0 porque essa memória é reservada pelo sistema operacional. No entanto, o endereço de memória 0 tem um significado especial; ele sinaliza que o ponteiro não se destina a apontar para um local de memória acessível. Mas, por convenção, se um ponteiro contém o valor nil (zero), presume-se que ele não aponte para nada.

Para verificar se há um ponteiro nulo, você pode usar uma instrução if da seguinte maneira -

if(ptr != nil)     /* succeeds if p is not nil */
if(ptr == nil)    /* succeeds if p is null */

Ponteiros Go em detalhes

Os ponteiros têm muitos conceitos, mas fáceis, e são muito importantes para a programação Go. Os seguintes conceitos de ponteiros devem ser claros para um programador Go -

Sr. Não Conceito e descrição
1 Go - matriz de ponteiros

Você pode definir matrizes para conter uma série de ponteiros.

2 Go - Ponteiro para ponteiro

Go permite que você tenha um ponteiro sobre um ponteiro e assim por diante.

3 Passando ponteiros para funções no Go

Passar um argumento por referência ou por endereço permite que o argumento passado seja alterado na função de chamada pela função chamada.