Menu
Coddy logo textTech

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.

quiz iconTeste seus conhecimentos

Esta lição inclui um quiz rápido. Comece a lição para respondê-lo e acompanhar seu progresso.

quiz iconTeste seus conhecimentos

Esta lição inclui um quiz rápido. Comece a lição para respondê-lo e acompanhar seu progresso.

quiz iconTeste seus conhecimentos

Esta lição inclui um quiz rápido. Comece a lição para respondê-lo e acompanhar seu progresso.

challenge icon

Desafio

Fácil

Neste 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 é:

  1. Definir uma struct Book com três campos: Title (string), Author (string), e Pages (int)
  2. Criar um método chamado displayInfo com um value receiver que imprime as informações do livro no formato: "Title: [title], Author: [author], Pages: [pages]"
  3. Criar um método chamado getDescription com um value receiver que retorna uma string no formato: "[title] by [author]"
  4. Usar bufio.Scanner para ler as linhas de entrada corretamente:
    • Criar um scanner: scanner := bufio.NewScanner(os.Stdin)
    • Para cada linha de entrada: chame scanner.Scan() e depois scanner.Text()
    • Isso garante que títulos e nomes de autores com espaços sejam lidos corretamente
  5. Analisar as entradas para criar uma instância de Book
  6. Chamar o método displayInfo para imprimir as informações do livro
  7. Chamar o método getDescription e 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
    
}
quiz iconTeste seus conhecimentos

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