Go é bom para estruturas de dados e algoritmos?
Sim. Ele compila para código nativo rápido, a sintaxe é pequena o bastante para que a maior parte do que você lê seja o algoritmo, e os generics (desde o Go 1.18) tornam reutilizável uma pilha ou um heap tipado. A contrapartida é uma biblioteca padrão enxuta: além de slices, maps, container/list e container/heap, você escreve as estruturas por conta própria, o que, numa trilha de aprendizado, é justamente o objetivo. O Go também roda boa parte da infraestrutura de nuvem atual, incluindo Docker e Kubernetes, o que faz dele uma linguagem natural de entrevista para vagas de backend.
Quais tipos e pacotes do Go correspondem a quais estruturas de dados?
Um slice é um array dinâmico e, com append e reslicing, também é a sua pilha; um map é uma tabela hash, e map[T]struct{} é o conjunto idiomático; container/list é uma lista duplamente ligada; e container/heap mantém um heap binário sobre qualquer tipo que implemente heap.Interface. Não existe tipo de fila, árvore, trie nem grafo, então esses você mesmo constrói, nos passos um e dois.
Como o container/heap funciona em Go?
Você implementa heap.Interface em um tipo de slice seu: Len, Less e Swap, de sort.Interface, mais Push e Pop, que só acrescentam no fim do slice e removem do fim dele. Depois você chama as funções do pacote, heap.Push e heap.Pop, nunca os seus próprios métodos, e são elas que sobem e descem os elementos para manter a ordem. Parece estranho até você escrever um heap por conta própria, e é isso que você faz no passo dois.
Por que percorrer um map do Go com range dá uma ordem diferente a cada vez?
Porque o Go torna aleatória a ordem de iteração dos maps de propósito, para que nenhum programa passe a depender dela. Uma tabela hash não tem uma ordem significativa em nenhuma linguagem; o Go só garante que você perceba isso. Quando a ordem importa, como numa saída que um teste compara, junte as chaves em um slice e ordene-o, ou mantenha um slice ao lado do map.
Quais cursos desta trilha não são ensinados em Go?
Três: programação dinâmica e a série de entrevistas em Python, ensinadas em Python, e manipulação de bits, ensinada em C++. Eles aparecem listados depois dos passos, cada um com um link que o abre na própria linguagem. Uma tabela de memoização em Go é um slice ou um map, e o Go tem um operador de bits que o C++ não tem: &^, o AND NOT, que zera no operando da esquerda todo bit que está ligado no da direita.
Preciso saber Go antes de começar esta trilha?
Structs, ponteiros, slices, maps e métodos, no mínimo; generics ajudam, e você pode aprendê-los pelo caminho. Se isso for novidade, o curso de Go da Coddy te leva até esse ponto primeiro, de graça, e esta trilha continua de onde ele termina.