ūüöÄ Aula 43 – Tutorial Golang – Ordena√ß√£o de Slices em Go

ūüöÄAula 43 – Tutorial Golang – Ordena√ß√£o de Slices em Go

Tutorial Golang

Tutorial Golang

P√°gina principal do blog

Todas as aulas desse curso

Aula 42                        Aula 44

Redes Sociais do Código Fluente:

facebook

 

 


Scarlett Finch

Scarlett Finch √© uma influenciadora, ūüé§ cantora e ūüé∂compositora pop brit√Ęnica , 24 anos de idade, adora o Brasil e em especial o Rio de Janeiro.

Ela foi criada utilizando algumas ferramentas de IA como a que vou apresentar hoje, o Foooocus.

Siga a Scarlett Finch no Instagram:

 

 


Conecte-se comigo!

LinkedIn: Fique à vontade para me adicionar no LinkedIn.

Ao conectar-se comigo, voc√™ ter√° acesso a atualiza√ß√Ķes regulares sobre desenvolvimento web, insights profissionais e oportunidades de networking no setor de tecnologia.

GitHub: Siga-me no GitHub para ficar por dentro dos meus projetos mais recentes, colaborar em código aberto ou simplesmente explorar os repositórios que eu contribuo, o que pode ajudar você a aprender mais sobre programação e desenvolvimento de software.

Recursos e Afiliados

Explorando os recursos abaixo, você ajuda a apoiar nosso site.

Somos parceiros afiliados das seguintes plataformas:

  • letsrecast.ai – Redefina a maneira como voc√™ consome artigos com Recast. Esta plataforma transforma artigos longos em di√°logos de √°udio que s√£o informativos, divertidos e f√°ceis de entender. Ideal para quem est√° sempre em movimento ou busca uma forma mais conveniente de se manter informado. Experimente Recast agora.
  • dupdub.com – Explore o universo do marketing digital com DupDub. Esta plataforma oferece ferramentas inovadoras e solu√ß√Ķes personalizadas para elevar a sua estrat√©gia de marketing online. Ideal para empresas que buscam aumentar sua visibilidade e efici√™ncia em campanhas digitais. Descubra mais sobre DupDub.
  • DeepBrain AI Studios – Revolucione a cria√ß√£o de conte√ļdo com a tecnologia de intelig√™ncia artificial da DeepBrain AI Studios. Esta plataforma avan√ßada permite que voc√™ crie v√≠deos interativos e apresenta√ß√Ķes utilizando avatares digitais gerados por IA, que podem simular conversas reais e intera√ß√Ķes humanas. Perfeito para educadores, criadores de conte√ļdo e empresas que querem inovar em suas comunica√ß√Ķes digitais. Explore DeepBrain AI Studios.
  • Audyo.ai – Transforme a maneira como voc√™ interage com conte√ļdo auditivo com Audyo.ai. Esta plataforma inovadora utiliza intelig√™ncia artificial para criar experi√™ncias de √°udio personalizadas, melhorando a acessibilidade e a compreens√£o de informa√ß√Ķes atrav√©s de podcasts, transcri√ß√Ķes autom√°ticas e s√≠ntese de voz avan√ßada. Ideal para profissionais de m√≠dia, educadores e qualquer pessoa que deseje acessar informa√ß√Ķes auditivas de maneira mais eficiente e envolvente. Descubra Audyo.ai e suas possibilidades.
  • Acoust.io – Transforme sua produ√ß√£o de √°udio com Acoust.io. Esta plataforma inovadora fornece uma suite completa de ferramentas para cria√ß√£o, edi√ß√£o e distribui√ß√£o de √°udio, ideal para artistas, produtores e empresas de m√≠dia em busca de excel√™ncia e inova√ß√£o sonora. Acoust.io simplifica o processo de levar suas ideias √† realidade, oferecendo solu√ß√Ķes de alta qualidade que elevam seus projetos de √°udio. Experimente Acoust.io agora e descubra um novo patamar de possibilidades para seu conte√ļdo sonoro.
  • Hostinger¬†– Hospedagem web acess√≠vel e confi√°vel. Ideal para quem busca solu√ß√Ķes de hospedagem de sites com excelente custo-benef√≠cio e suporte ao cliente robusto. Saiba mais sobre a Hostinger.
  • Digital Ocean¬†– Infraestrutura de nuvem para desenvolvedores. Oferece uma plataforma de nuvem confi√°vel e escal√°vel projetada especificamente para desenvolvedores que precisam de servidores virtuais, armazenamento e networking. Explore a Digital Ocean.
  • One.com – Solu√ß√Ķes simples e poderosas para o seu site. Uma escolha ideal para quem busca registrar dom√≠nios, hospedar sites ou criar presen√ßa online com facilidade e efici√™ncia. Visite One.com.

Educação e Networking

Amplie suas habilidades e sua rede participando de cursos gratuitos e comunidades de desenvolvedores:

Canais do Youtube

Explore nossos canais no YouTube para uma variedade de conte√ļdos educativos e de entretenimento, cada um com um foco √ļnico para enriquecer sua experi√™ncia de aprendizado e lazer.

Toti

Toti: Meu canal pessoal, onde posto clips artesanais de m√ļsicas que curto tocar, dicas de teoria musical, entre outras coisas.

Lofi Music Zone Beats

Lofi Music Zone Beats: O melhor da m√ļsica Lofi para estudo, trabalho e relaxamento, criando o ambiente perfeito para sua concentra√ß√£o.

Backing Track / Play-Along

Backing Track / Play-Along: Acompanhe faixas instrumentais para pr√°tica musical, ideal para m√ļsicos que desejam aprimorar suas habilidades.

Código Fluente

Código Fluente: Aulas gratuitas de programação, devops, IA, entre outras coisas.

Putz!

Putz!: Canal da banda Putz!, uma banda virtual, criada durante a pandemia com mais 3 amigos, F√°bio, Tat√° e Lula.

PIX para doa√ß√Ķes

PIX Nubank

PIX Nubank


ūüöÄ Aula 43 – Tutorial Golang – Ordena√ß√£o de Slices em Go

Código da aula: Github

Introdução ao Pacote sort

O pacote sort do Go fornece fun√ß√Ķes e m√©todos para ordenar slices de diversos tipos de dados, como n√ļmeros inteiros, strings e structs personalizadas.

Essa aula abordará os conceitos básicos de ordenação em Go, utilizando o pacote sort para ordenar slices de diferentes tipos.

Interface sort.Interface

Para que um tipo de dado possa ser ordenado com o pacote sort, ele precisa implementar a interface sort.Interface.

Esta interface requer três métodos:

  • Len() int: Retorna o tamanho da slice.
  • Less(i, j int) bool: Compara os elementos nos √≠ndices i e j e retorna true se o elemento i deve vir antes do elemento j na ordem final.
  • Swap(i, j int): Troca os elementos nos √≠ndices i e j de posi√ß√£o.
    Ao implementar estes métodos, você define como o pacote sort deve comparar e ordenar os elementos do slice.

Fun√ß√Ķes de Ordena√ß√£o Pr√©-definidas

O pacote sort oferece fun√ß√Ķes pr√©-definidas para ordenar slices de tipos comuns:

  • sort.Ints(): Ordena slices de int.
  • sort.Strings(): Ordena slices de string.
  • sort.Float64s(): Ordena slices de float64.

Estas fun√ß√Ķes utilizam um algoritmo de ordena√ß√£o h√≠brido, combinando o quicksort com o insertion sort para efici√™ncia.

Ordenação Personalizada

Para tipos de dados com critérios de ordenação específicos, é necessário implementar uma função de comparação personalizada.

Esta função deve seguir a mesma lógica do método Less() da interface sort.Interface.

Após definir a função de comparação, você pode usar a função sort.Sort() para ordenar o slice, passando a função personalizada como argumento.

Aplica√ß√Ķes da Ordena√ß√£o

A ordena√ß√£o de slices √© √ļtil em diversos cen√°rios, como:

  • Organizar dados para exibi√ß√£o ou an√°lise.
  • Filtrar resultados de buscas.
  • Implementar algoritmos que exigem dados ordenados.
  • Melhorar a efici√™ncia de outras opera√ß√Ķes.

Conceitos Adicionais

Restri√ß√£o Ordered: A restri√ß√£o gen√©rica Ordered permite trabalhar com qualquer tipo que suporte os operadores de compara√ß√£o (<, <=, >=, >), como n√ļmeros e strings. As fun√ß√Ķes de ordena√ß√£o do pacote sort s√£o gen√©ricas e funcionam com qualquer tipo que atenda a esta restri√ß√£o.

Verificação de Ordenação: Embora não exista um pacote padrão para verificar se um slice já está ordenado, você pode implementar esta funcionalidade manualmente iterando pelo slice e comparando elementos adjacentes.

Implementação Interna

O pacote slices tem as fun√ß√Ķes Sort e SortFunc, essas fun√ß√Ķes utilizam internamente o mesmo algoritmo de ordena√ß√£o que o pacote sort tradicionalmente usa.

Esse algoritmo é uma variação do quicksort chamada introsort, ou introspective sort.

O quicksort é conhecido por sua eficiência em muitos casos práticos, sendo um dos algoritmos de ordenação mais rápidos para uso geral.

No entanto, tem uma vulnerabilidade em determinadas configura√ß√Ķes de dados, por exemplo, em dados quase ordenados ou quando todos os elementos s√£o iguais, o quicksort pode ter um desempenho muito pior, chegando a uma complexidade de tempo O(n¬≤), o que √© consideravelmente lento para grandes conjuntos de dados.

Para mitigar esse problema, o introsort foi desenvolvido.

Veja como acontece:

  1. Início com Quicksort: O introsort começa usando o quicksort para tentar aproveitar sua rapidez em casos médios.
  2. Monitoramento da Profundidade: Ele monitora a profundidade da recurs√£o do quicksort. A profundidade m√°xima permitida geralmente √© logar√≠tmica em rela√ß√£o ao n√ļmero de elementos (log n). Se o algoritmo perceber que a profundidade da recurs√£o est√° excedendo um limite cr√≠tico sem terminar (indicando que est√° indo em dire√ß√£o √† complexidade O(n¬≤)), ele interv√©m.
  3. Mudança para Heapsort: Neste ponto, se a complexidade parece estar se deteriorando, o introsort muda para o heapsort. O heapsort é um pouco mais lento que o quicksort em casos médios, mas possui uma complexidade de tempo garantida de O(n log n) no pior caso, independentemente dos dados de entrada. Isso impede que a ordenação se torne ineficientemente lenta.
  4. Finalização com Insertion Sort: Para conjuntos de dados muito pequenos, o introsort pode finalizar com insertion sort, que é eficiente para pequenas quantidades de elementos devido ao seu baixo custo adicional de operação e simplicidade.

Considera√ß√Ķes Finais

O pacote sort é uma ferramenta poderosa para trabalhar com slices em Go.

Ele facilita a ordenação de dados de diversos tipos, tornando o código mais organizado e eficiente.

Explore a documentação do pacote e os recursos adicionais para aprofundar seu conhecimento sobre ordenação.

Exemplos pr√°ticos

Vamos ver alguns exemplos práticos de ordenação.

OrdenaçãoGenérica: Esse exemplo demonstra uma ordenação genérica com slices.Sort() para strings e inteiros, além de verificar a ordenação usando slices.IsSorted(), destacando a versatilidade do pacote slices para lidar com diferentes tipos de dados.


package main

import (
"fmt"
"slices"
)

func main() {

// Sorting functions are generic, and work for any
// _ordered_ built-in type. For a list of ordered
// types, see [cmp.Ordered](https://pkg.go.dev/cmp#Ordered).
strs := []string{"c", "a", "b"}
slices.Sort(strs)
fmt.Println("Strings:", strs)

// An example of sorting `int`s.
ints := []int{7, 2, 4}
slices.Sort(ints)
fmt.Println("Ints: ", ints)

// We can also use the `slices` package to check if
// a slice is already in sorted order.
s := slices.IsSorted(ints)
fmt.Println("Sorted: ", s)
}

Ordena√ß√£o de Datas: Muito √ļtil em sistemas de agendamento ou relat√≥rios que exigem ordena√ß√£o cronol√≥gica.

package main

import (
	"fmt"
	"slices"
	"time"
)

func main() {
	datas := []time.Time{
		time.Date(2023, time.December, 10, 0, 0, 0, 0, time.UTC),
		time.Date(2024, time.January, 5, 0, 0, 0, 0, time.UTC),
		time.Date(2024, time.July, 20, 0, 0, 0, 0, time.UTC),
	}

	slices.SortFunc(datas, func(a, b time.Time) int {
		if a.Equal(b) {
			return 0
		}
		if a.Before(b) {
			return -1
		}
		return 1
	})

	fmt.Println("Datas ordenadas:", datas)
}

Ordenação de Structs Personalizadas: Ordenando pessoas por idade ou nome, comum em registros ou sistemas de RH.

package main

import (
	"fmt"
	"slices"
)

type Pessoa struct {
	Nome  string
	Idade int
}

func main() {
	pessoas := []Pessoa{
		{"Maria", 30},
		{"Jo√£o", 25},
		{"Ana", 28},
	}

	// Ordenando por idade
	slices.SortFunc(pessoas, func(a, b Pessoa) int {
		return a.Idade - b.Idade // Retorna negativo se a < b, zero se a == b, positivo se a > b
	})
	fmt.Println("Pessoas ordenadas por idade:", pessoas)

	// Ordenando por nome
	slices.SortFunc(pessoas, func(a, b Pessoa) int {
		if a.Nome < b.Nome { return -1 } else if a.Nome > b.Nome {
			return 1
		}
		return 0
	})
	fmt.Println("Pessoas ordenadas por nome:", pessoas)
}

Ordenação de Produtos por Preço ou Nome: Útil para e-commerce ou sistemas de estoque.

package main

import (
	"fmt"
	"slices"
)

type Produto struct {
	Nome  string
	Preço float64
}

func main() {
	produtos := []Produto{
		{"Caderno", 7.50},
		{"Caneta", 3.75},
		{"Mochila", 56.90},
	}

	// Ordenando por preço
	slices.SortFunc(produtos, func(a, b Produto) int {
		if a.Preço < b.Preço { return -1 } else if a.Preço > b.Preço {
			return 1
		}
		return 0
	})
	fmt.Println("Produtos ordenados por preço:", produtos)

	// Ordenando por nome
	slices.SortFunc(produtos, func(a, b Produto) int {
		if a.Nome < b.Nome { return -1 } else if a.Nome > b.Nome {
			return 1
		}
		return 0
	})
	fmt.Println("Produtos ordenados por nome:", produtos)
}

Nesta aula, exploramos o poder do pacote sort em Go para ordenar slices de maneira eficiente e flexível.

Aprendemos sobre a interface sort.Interface e como implement√°-la para tipos de dados personalizados, permitindo que o pacote sort os ordene de acordo com nossas necessidades.

Vimos as fun√ß√Ķes de ordena√ß√£o pr√©-definidas para tipos comuns e como elas utilizam um algoritmo h√≠brido para garantir efici√™ncia.

Al√©m disso, mergulhamos na ordena√ß√£o personalizada, aprendendo a criar fun√ß√Ķes de compara√ß√£o para crit√©rios espec√≠ficos e utiliz√°-las com sort.Sort().

Os exemplos práticos demonstraram a aplicação da ordenação em cenários do dia a dia, como ordenação de datas, structs personalizados e produtos, mostrando a versatilidade do pacote sort.

Tamb√©m abordamos conceitos adicionais como a restri√ß√£o gen√©rica Ordered, que permite que as fun√ß√Ķes de ordena√ß√£o funcionem com diversos tipos de dados, e a possibilidade de verificar se um slice j√° est√° ordenada.

Com o conhecimento adquirido nesta aula, você está preparado para aplicar a ordenação de slices em seus projetos Go, tornando seu código mais organizado, eficiente e poderoso.

Lembre-se de explorar a documentação do pacote sort e os recursos adicionais para aprofundar seu aprendizado e descobrir ainda mais possibilidades.

Continue explorando, praticando e ordenando!

Até a próxima!

P√°gina principal do blog

Todas as aulas desse curso

Aula 42                        Aula 44

About The Author
-

You may use these HTML tags and attributes: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <s> <strike> <strong>