Spec Sistemas Com Go • Trilha Progressiva em 4 Níveis


🧭 Navegação Pedagógica


🎯 Nível 1: Fundamentos

Problema 08.1 — Função com Retornos Múltiplos Nomeados

Contexto: Função com Retornos Múltiplos Nomeados no contexto de Funções, Retornos Múltiplos, Variádicas e Closures.

Requisitos de Execução:

  1. Criar função divisao(dividendo, divisor int) (quociente, resto int, err error).

Resultado Esperado

Retornos múltiplos nomeados retornados com tratamento de erro.

📤 Instruções de Entrega (Microsoft Teams)

  1. Salve o arquivo como: Atividade_08_1_SeuNome
  2. Envie na tarefa: Atividade Cap 08 - Funções, Retornos Múltiplos, Variádicas e Closures
🔑 Gabarito de Código & Solução Comentada
package main

import (
    "errors"
    "fmt"
)

func dividir(a, b int) (quo, resto int, err error) {
    if b == 0 {
        return 0, 0, errors.New("divisao por zero")
    }
    return a / b, a % b, nil
}

func main() {
    q, r, _ := dividir(17, 5)
    fmt.Printf("17 / 5 = %d (Resto: %d)\n", q, r)
}

🔍 Nível 2: Prática

Problema 08.2 — Funções Variádicas com Operador Ellipsis (…T)

Contexto: Funções Variádicas com Operador Ellipsis (…T) no contexto de Funções, Retornos Múltiplos, Variádicas e Closures.

Requisitos de Execução:

  1. Criar função somar(nums ...int) int que receba quantidade arbitrária de inteiros.

Resultado Esperado

Função variádica somando lista dinâmica de argumentos.

📤 Instruções de Entrega (Microsoft Teams)

  1. Salve o arquivo como: Atividade_08_2_SeuNome
  2. Envie na tarefa: Atividade Cap 08 - Funções, Retornos Múltiplos, Variádicas e Closures
🔑 Gabarito de Código & Solução Comentada
package main

import "fmt"

func somar(numeros ...int) int {
    total := 0
    for _, n := range numeros {
        total += n
    }
    return total
}

func main() {
    fmt.Println("Soma:", somar(10, 20, 30, 40))
}

⚡ Nível 3: Integração

Problema 08.3 — Closures e Funções Anônimas com Captura de Escopo

Contexto: Closures e Funções Anônimas com Captura de Escopo no contexto de Funções, Retornos Múltiplos, Variádicas e Closures.

Requisitos de Execução:

  1. Criar função geradora de contadores gerarContador() func() int preservando estado local.

Resultado Esperado

Closure mantendo estado privado entre invocações sucessivas.

📤 Instruções de Entrega (Microsoft Teams)

  1. Salve o arquivo como: Atividade_08_3_SeuNome
  2. Envie na tarefa: Atividade Cap 08 - Funções, Retornos Múltiplos, Variádicas e Closures
🔑 Gabarito de Código & Solução Comentada
package main

import "fmt"

func criarContador() func() int {
    c := 0
    return func() int {
        c++
        return c
    }
}

func main() {
    cont := criarContador()
    fmt.Println(cont(), cont(), cont()) // 1, 2, 3
}

🏆 Nível 4: Desafio Corporativo

Problema 08.4 — Padrão Functional Options para Configuração de Serviços

Contexto: Padrão Functional Options para Configuração de Serviços no contexto de Funções, Retornos Múltiplos, Variádicas e Closures.

Requisitos de Execução:

  1. Implementar type Option func(*Servidor) permitindo configuração modular e extensível.

Resultado Esperado

Servidor instanciado utilizando o padrão idiomático Functional Options.

📤 Instruções de Entrega (Microsoft Teams)

  1. Salve o arquivo como: Atividade_08_4_SeuNome
  2. Envie na tarefa: Atividade Cap 08 - Funções, Retornos Múltiplos, Variádicas e Closures
🔑 Gabarito de Código & Solução Comentada
package main

import "fmt"

type Servidor struct { porta int; host string }
type Option func(*Servidor)

func ComPorta(p int) Option { return func(s *Servidor) { s.porta = p } }

func NovoServidor(opts ...Option) *Servidor {
    srv := &Servidor{porta: 8080, host: "localhost"}
    for _, opt := range opts { opt(srv) }
    return srv
}

func main() {
    srv := NovoServidor(ComPorta(9000))
    fmt.Printf("Servidor rodando na porta: %d\n", srv.porta)
}

⬅️ Voltar ao Índice de Exercícios 📚 Sumário de Tópicos