Funções em Golang

GolangBeginner
Pratique Agora

Introdução

À medida que os projetos crescem em complexidade, é comum dividir o código em múltiplas funções. Essa abordagem melhora a legibilidade do código, facilita a colaboração e permite reutilizar rapidamente a lógica sem duplicar código. Neste laboratório, você aprenderá os fundamentos da criação e utilização de funções em Go. Você verá como definir suas próprias funções, entender como Go lida com parâmetros e valores de retorno, e aprender sobre funções init e parâmetros variádicos.

Tópicos Chave:

  • Entendendo o que são funções e como elas funcionam
  • Declarando funções em Go
  • Passando parâmetros por valor e por referência
  • Retornando múltiplos valores de uma função
  • Usando a função init para configurar seu ambiente
  • Trabalhando com parâmetros variádicos para manipulação flexível de entrada

Criando e Executando um Programa Básico

Primeiramente, navegue até o diretório do seu projeto e crie um arquivo Go:

cd ~/project
touch func.go

Use um editor de texto para abrir func.go e adicione o seguinte código:

package main

import "fmt"

func main() {
    a1, b1 := 12, 4
    a2, b2 := 12, 0

    // For the first pair
    if b1 == 0 {
        fmt.Println("The divisor cannot be 0")
    } else {
        fmt.Println(a1 / b1)
    }

    // For the second pair
    if b2 == 0 {
        fmt.Println("The divisor cannot be 0")
    } else {
        fmt.Println(a2 / b2)
    }
}

Este código tenta duas operações de divisão e verifica um divisor zero antes da divisão. Se o divisor for zero, ele imprime uma mensagem de erro.

Execute o programa:

go run func.go

Você deve ver:

3
The divisor cannot be 0

Declaração de Funções

Nos laboratórios anteriores, independentemente de o programa ser simples ou complexo, usamos apenas a função main para as operações.

Um programa pode ter apenas uma função main, que é o ponto de entrada do programa. Quando executamos o programa, outras funções são chamadas e executadas direta ou indiretamente dentro da função main.

Agora, vamos dar uma olhada na sintaxe das funções:

func functionName(parameters...)(returnValues...){
    code block
}

Aqui, o nome da função é usado para identificar a função. As seguintes regras se aplicam ao nome da função:

  • Pode consistir em letras, números e sublinhados. No entanto, a primeira letra do nome da função não pode ser um número. Por exemplo, func 3ab(){} não é válido.
  • Quando a primeira letra é maiúscula, ela pode ser referenciada por código em pacotes externos. Quando a primeira letra é minúscula, ela só pode ser usada dentro do pacote. Isso é semelhante às funções públicas e privadas.

A lista de parâmetros declara o número e o tipo de parâmetros passados para a função:

  • A lista de parâmetros pode estar vazia ou conter múltiplos parâmetros.

  • Cada parâmetro consiste em um nome de parâmetro e um tipo de parâmetro. Por exemplo, na lista de parâmetros abaixo, declaramos duas variáveis do tipo int.

    func test(a, b int) (res int){}

A lista de valores de retorno é usada para retornar os valores necessários após a execução da função:

  • A lista de valores de retorno é semelhante à lista de parâmetros. O número de parâmetros pode ser qualquer valor.

  • Geralmente, a lista de retorno consiste em nomes de variáveis e tipos de variáveis, e o nome da variável é opcional.

  • Se apenas uma variável for retornada e apenas o tipo da variável for declarado, os parênteses podem ser omitidos. Por exemplo:

    func test(a int, b string) int{}

Quando os tipos de parâmetros são os mesmos, podemos usar o modo de escrita abreviada. As duas funções abaixo têm a mesma funcionalidade:

func test(a, b int, c, d string)(res1, res2 int, res3 string){}

// Short writing mode
func test(a, b int, c, d string)(res1, res2 int, res3 string){}

Substitua o conteúdo de func.go pelo seguinte código:

package main

import "fmt"

func check(divisor int) bool {
    if divisor == 0 {
        fmt.Println("The divisor cannot be 0")
        return false
    }
    return true
}

func main() {
    a1, b1 := 12, 4
    a2, b2 := 12, 0

    // Use the check function before division
    if check(b1) {
        fmt.Println(a1 / b1)
    }
    if check(b2) {
        fmt.Println(a2 / b2)
    }
}

Execute o programa novamente:

go run func.go

Você deve ver a mesma saída:

3
The divisor cannot be 0

Desta vez, a lógica de verificação é encapsulada na função check, tornando o código mais limpo e reutilizável.

Usando a Função init

Go suporta uma função init que é executada antes de main. Isso é frequentemente usado para configurar condições de ambiente ou inicializar variáveis antes da execução principal.

Substitua o conteúdo de func.go por:

package main

import "fmt"

func init() {
    fmt.Println("init statement")
}

func main() {
    fmt.Println("main statement")
}

Execute o programa:

go run func.go

Você deve ver:

init statement
main statement

Em Go, a função init tem as seguintes características:

  • Não possui nenhum parâmetro de entrada ou valores de retorno.
  • Não pode ser chamada por outras funções.

Pode haver múltiplas funções init no mesmo arquivo de código ou no mesmo pacote. A ordem de execução é a seguinte:

  • A função init que aparece primeiro no mesmo arquivo de código será executada primeiro.
  • Arquivos que têm ordem alfabética anterior no mesmo package serão executados primeiro. Por exemplo, se o mesmo package contiver os seguintes arquivos com funções init:
a1.go
a2.go
b1.go

A ordem de execução será a1.go, a2.go, b1.go, porque a > b e 1 < 2.

Retornando Múltiplos Valores de uma Função

Go permite que funções retornem múltiplos valores. Isso é útil para realizar várias computações relacionadas de uma só vez.

Substitua o conteúdo de func.go por:

package main

import "fmt"

func cal(a, b int) (int, int, int, int) {
    return a + b, a - b, a * b, a % b
}

func main() {
    add, sub, mul, rem := cal(90, 12)
    fmt.Println(add, sub, mul, rem)
}

Execute o programa:

go run func.go

Você deve ver:

102 78 1080 6

Aqui, cal retorna quatro valores de uma só vez, ilustrando como múltiplos valores de retorno podem simplificar certas tarefas.

Trabalhando com Parâmetros Variádicos

Parâmetros variádicos permitem que uma função aceite um número variável de argumentos. Isso pode simplificar cenários onde o tamanho da entrada não é fixo.

Substitua o conteúdo de func.go por:

package main

import "fmt"

func printX(values ...string) {
    for _, v := range values {
        fmt.Println(v)
    }
}

func main() {
    printX("labex", "labs", "courses")
}

Execute o programa:

go run func.go

Você deve ver:

labex
labs
courses

A função printX pode lidar com qualquer número de argumentos string, tornando-a flexível e fácil de usar.

Resumo

Neste laboratório, você aprendeu como definir e usar funções em Go, incluindo como retornar múltiplos valores e aceitar um número variável de parâmetros. Você também viu como a função init é executada antes de main. Ao estruturar o código em funções, você pode tornar seus programas mais fáceis de entender, manter e reutilizar.

Essas habilidades são fundamentais para construir aplicações Go modulares e escaláveis. À medida que seus projetos crescem, aproveitar as funções para organizar o código e a lógica se tornará cada vez mais importante.