Definindo Métodos em Structs
Parte da seção Lógica & Fluxo do Journey de GO da Coddy — lição 6 de 68.
Em Go, um método é uma função que pertence a um tipo específico. Diferente de funções regulares que existem de forma independente, os métodos são vinculados a structs e permitem que você defina o comportamento para seus tipos de dados personalizados.
Para definir um método, você coloca um receptor entre a palavra-chave func e o nome do método. O receptor especifica a qual tipo o método pertence.
type Person struct {
Name string
Age int
}
func (p Person) greet() {
fmt.Printf("Hello, my name is %s\n", p.Name)
}Neste exemplo, (p Person) é o receptor, tornando greet um método do tipo Person. A variável p representa a instância de Person na qual o método é chamado, semelhante ao this em outras linguagens.
Você pode então chamar o método usando a notação de ponto em qualquer instância de Person, dando às suas structs a capacidade de realizar ações relacionadas aos seus dados.
Esta lição inclui um quiz rápido. Comece a lição para respondê-lo e acompanhar seu progresso.
Esta lição inclui um quiz rápido. Comece a lição para respondê-lo e acompanhar seu progresso.
Esta lição inclui um quiz rápido. Comece a lição para respondê-lo e acompanhar seu progresso.
Desafio
FácilNeste desafio, você praticará a definição de métodos em structs criando um sistema simples de gerenciamento de livros. Você criará uma struct Book e definirá métodos que permitem ao livro exibir suas informações.
Nota Importante: Como os títulos dos livros e os nomes dos autores podem conter espaços, você precisará usar bufio.Scanner para ler linhas inteiras de entrada. A função fmt.Scanln para de ler no primeiro espaço, o que interromperia títulos e nomes de autores com várias palavras. Use bufio.NewScanner(os.Stdin) e chame scanner.Scan() seguido de scanner.Text() para ler linhas completas.
Você receberá três entradas:
- Uma string representando o título do livro (ex:
"The Go Programming Language") - Uma string representando o nome do autor (ex:
"Alan Donovan") - Uma string representando o número de páginas (ex:
"380")
Sua tarefa é:
- Definir uma struct
Bookcom três campos:Title(string),Author(string), ePages(int) - Criar um método chamado
displayInfocom um value receiver que imprime as informações do livro no formato:"Title: [title], Author: [author], Pages: [pages]" - Criar um método chamado
getDescriptioncom um value receiver que retorna uma string no formato:"[title] by [author]" - Usar
bufio.Scannerpara ler as linhas de entrada corretamente:- Criar um scanner:
scanner := bufio.NewScanner(os.Stdin) - Para cada linha de entrada: chame
scanner.Scan()e depoisscanner.Text() - Isso garante que títulos e nomes de autores com espaços sejam lidos corretamente
- Criar um scanner:
- Analisar as entradas para criar uma instância de
Book - Chamar o método
displayInfopara imprimir as informações do livro - Chamar o método
getDescriptione imprimir a descrição retornada
Os métodos devem usar a variável receiver para acessar os campos da struct e realizar suas respectivas operações. Lembre-se de que métodos com value receivers trabalham com uma cópia da instância da struct.
Folha de consulta
Métodos em Go são funções que pertencem a um tipo específico. Eles são definidos com um receptor entre a palavra-chave func e o nome do método:
type Person struct {
Name string
Age int
}
func (p Person) greet() {
fmt.Printf("Hello, my name is %s\n", p.Name)
}O receptor (p Person) torna greet um método do tipo Person. A variável p representa a instância na qual o método é chamado.
Métodos são chamados usando a notação de ponto em instâncias de struct, permitindo que as structs realizem ações relacionadas aos seus dados.
Experimente você mesmo
package main
import (
"bufio"
"fmt"
"os"
"strconv"
)
// TODO: Defina sua struct Book aqui
// TODO: Defina seu método displayInfo aqui
// TODO: Defina seu método getDescription aqui
func main() {
// Cria o scanner para ler as linhas de entrada
scanner := bufio.NewScanner(os.Stdin)
// Lê o título
scanner.Scan()
title := scanner.Text()
// Lê o autor
scanner.Scan()
author := scanner.Text()
// Lê as páginas
scanner.Scan()
pagesStr := scanner.Text()
// Converte a string de páginas para inteiro
pages, _ := strconv.Atoi(pagesStr)
// TODO: Crie uma instância de Book e chame os métodos
}Esta lição inclui um quiz rápido. Comece a lição para respondê-lo e acompanhar seu progresso.
Todas as lições de Lógica & Fluxo
1Fluxo de Controle Avançado
Switch com `fallthrough`Interrompendo Loops AninhadosContinuando um Loop EspecíficoA Instrução `goto`Recapitulação - Controle de Loop Avançado4Projeto: Lista de Tarefas Simples
Configuração do ProjetoAdicionando uma Tarefa2Structs e Métodos
Definindo Métodos em StructsRecebedores de ValorRecebedores de PonteiroEscolhendo RecebedoresMétodos vs FunçõesRecapitulação - Comportamento de Structs5Mapas em Profundidade
Mapas de StructsPonteiros como Valores de MapVerificando Mapas NilComparando MapasRecapitulação - Contador de Frequência de Palavras3Interfaces (O Básico)
O que é uma Interface?Definindo uma InterfaceImplementando uma InterfaceUsando Tipos de InterfaceInterface VaziaAsserções de TipoType SwitchRecapitulação - Formas e Comportamentos