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.

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 permitirão ao livro exibir suas informações.

Observação importante: Como os títulos dos livros e os nomes dos autores podem conter espaços, você precisará usar bufio.Scanner para ler linhas de entrada completas. A função fmt.Scanln para de ler no primeiro espaço, o que faria com que títulos e nomes de autores com várias palavras fossem lidos incorretamente. 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 (por exemplo, "The Go Programming Language")
  • Uma string representando o nome do autor (por exemplo, "Alan Donovan")
  • Uma string representando o número de páginas (por exemplo, "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 receptor por valor que exiba as informações do livro no formato: "Title: [title], Author: [author], Pages: [pages]"
  3. Criar um método chamado getDescription com um receptor por valor que retorne uma string no formato: "[title] by [author]"
  4. Usar bufio.Scanner para ler corretamente as linhas de entrada:
    • Criar um scanner: scanner := bufio.NewScanner(os.Stdin)
    • Para cada linha de entrada: chamar 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 exibir as informações do livro
  7. Chamar o método getDescription e exibir a descrição retornada

Os métodos devem usar a variável receptora para acessar os campos da struct e realizar suas respectivas operações. Lembre-se de que métodos com receptores por valor trabalham com uma cópia da instância da struct.

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

Pratique por conta própria: Compilador de Go online