Fácil Go

Método que dobra um número

Enunciado

Crie um tipo Numero com um campo valor int e um método Dobro() que retorna o dobro do valor. Use receiver de valor.

Requisitos

  • Definir type Numero struct { valor int }
  • Método Dobro() int com receiver de valor
  • No main, criar Numero{7} e imprimir o resultado de Dobro()

Código inicial

package main

import "fmt"

type Numero struct {
	valor int
}

// TODO: implemente o método Dobro com receiver de valor

func main() {
	n := Numero{valor: 7}
	// TODO: imprima n.Dobro()
}

Saída esperada

14
Ver dica

O receiver de valor é declarado como (n Numero). Dentro do método, acesse n.valor.

Mostrar solução
package main

import "fmt"

type Numero struct {
	valor int
}

// Receiver de valor: recebe uma cópia de Numero.
func (n Numero) Dobro() int {
	return n.valor * 2
}

func main() {
	n := Numero{valor: 7}
	fmt.Println(n.Dobro())
}

Passo a passo

  1. Declaramos type Numero struct { valor int }, um tipo próprio com um campo inteiro.
  2. O método Dobro usa receiver de valor (n Numero), então recebe uma cópia do struct.
  3. Dentro do método, n.valor * 2 calcula o dobro e retorna como int.
  4. No main, criamos n := Numero{valor: 7}.
  5. Chamamos n.Dobro() e imprimimos o resultado com fmt.Println.

Por que funciona

O receiver de valor cria uma cópia independente, então o método não altera o n original. Como só lemos o campo, não há necessidade de ponteiro. O method set de Numero inclui Dobro, permitindo chamá-lo diretamente em valores.

Erros comuns

  • Esquecer o receiver: func Dobro() int causa erro de compilação, pois métodos precisam de receiver.
  • Usar n *Numero sem necessidade: funciona, mas é desnecessário para leitura.
  • Acessar campo inexistente: n.numero gera erro de compilação.

Outra forma de resolver

Se quiséssemos modificar o valor original, usaríamos receiver de ponteiro:

func (n *Numero) Dobro() { n.valor *= 2 }

Mas isso mudaria o enunciado, que pede retorno.

Saída esperada

14