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() intcom receiver de valor - No
main, criarNumero{7}e imprimir o resultado deDobro()
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
- Declaramos
type Numero struct { valor int }, um tipo próprio com um campo inteiro. - O método
Dobrousa receiver de valor(n Numero), então recebe uma cópia do struct. - Dentro do método,
n.valor * 2calcula o dobro e retorna comoint. - No
main, criamosn := Numero{valor: 7}. - Chamamos
n.Dobro()e imprimimos o resultado comfmt.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() intcausa erro de compilação, pois métodos precisam de receiver. - Usar
n *Numerosem necessidade: funciona, mas é desnecessário para leitura. - Acessar campo inexistente:
n.numerogera 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