1
resposta

Multiplos tipos

Olá gostaria de saber se meu slice deve ser tipado sempre e receber somente o tipo informado, exemplo quero construir um slice que armaze qualquer tipo de dado [string int bool] é possivel?

1 resposta

Não, slice é, apesar de tudo, uma array, e seus interiores seguem as mesmas regras.

Arrays / slices são cadeias de memórias que guardam dados.

Dado um array de tamanho fixo 2, por exemplo, com tipo float64.

var arr [2]float64 = {1.2, 2.4}

então concluímos que o conteúdo dessa array tem um tamanho PREALOCADO de 128 bits (= 16 bytes), uma vez que cada elemento é um float64.

Isso impede que outros tipos sejam usados, mesmo que tenham o mesmo tamanho.

Com array, uma vez que tem tamanho fixo após inicialização, até que não teria problema em fazer isso, mas Golang não opera dessa maneira.

Já com slices que permitem diminuir ou aumentar em tamanho de elementos, seria problemático permitir incluir elementos de tipos variados. Por exemplo,

slice := [] problema1 = {1, "problema2"} 

Por 'problema 1' , seria o tipo, qual tipo deveríamos implementar? Em Dart (linguagem também da Google), usaríamos o tipo 'dynamic' para representar qualquer tipo, mas qual problema isso acarretaria? Exatamente, performance. Algo que GoLang não vai ignorar.

Por 'problema 2' seria um dado com qual tamanho? Não sabemos. Se for menor, fazemos com que espaço alocado não seja utilizado, o que até tudo bem. O problema real é receber erro de overflow por tentar encaixar um dado muito grande em uma alocação de memória insuficiente. Golang teria que checar isso durante a compilação (performance diminui) e se o tamanho for incompatível com a capacidade, teria que refazer o slice com o tamanho que precisa (mais diminuição na performance).

Eu entendo que, em Python, é possível fazer isso com as listas, mas entenda, essas são linked lists, ou seja, estruturas de dados onde um elemento aponta para o próximo elemento, algo que pode ser alcançado com alguma biblioteca, mas apenas apenas se você realmente precisar disso.

Recomendo ver um vídeo sobre implementação de linked list em C ou C++, esses vídeo pode te ajudar a entender um pouco do que eu tentei explicar e também te dar uma luz, caso você precise, quanto ao uso de ponteiros e referências.

Quer mergulhar em tecnologia e aprendizagem?

Receba a newsletter que o nosso CEO escreve pessoalmente, com insights do mercado de trabalho, ciência e desenvolvimento de software