Ainda não tem acesso? Estude com a gente! Matricule-se
Ainda não tem acesso? Estude com a gente! Matricule-se

Solucionado (ver solução)

Regra do Slice dobrar o tamanho do array

Curso: Iniciando com a linguagem Go do Google

Aula 05: As principais coleções em Go

Atividade 04: Slices em Go

Seguindo a regra apresentada na aula sobre o tamanho do Slice em relação a um array de tamanho fixo, quando eu adiciono um elemento em um array ele dobra o tamanho anterior, acontece que no código abaixo eu inicializei um Slice da seguinte maneira

estados := []string{} 

e usei a função nativa append() para adicionar ao slice um conjunto de dados. Seguindo a lógica de que ao incrementar o slice ele dobra a capacidade eu gostaria de entender como ele tratou o incremento no código abaixo, sendo que eu adicionei um conjunto de dados 4 vezes maior do que o tamanho inicial do slice.

Estou supondo que por baixo dos panos ele fez o incremento de um em um através de um loop, e foi dobrando o tamanho a cada iteração, gostaria de saber se é isso mesmo, ou ele trata de outra forma.

import (
    "fmt"
)

func main() {
    estados := devolveEstadosDoSudeste()
    fmt.Println(estados)
}

func devolveEstadosDoSudeste() []string {
    estados := []string{}
    estados = append(estados, "RJ", "SP", "MG", "ES")
    return estados
}
3 respostas

Caso você tente adicionar um elemento a um slice que já está no limite da sua capacidade, a função append dobra a capacidade do slice.

A lógica basicamente é calcular o tamanho necessário com base na lista de elementos passados + os itens já armazenados e dobrar essa quantidade para a criação do array novo.

Então a minha pergunta foi se no caso da atribuição abaixo:

estados = append(estados, "RJ", "SP", "MG", "ES")

Ele internamente está tratando cada estado como se fosse uma atribuição unitária fazendo um loop para adicionar um a um e a cada iteração ele refaz a análise do tamanho atual do slice.

solução

A análise do tamanho do slice é feita uma vez só com base na quantidade de elementos total do append(estados, "RJ", "SP", "MG", "ES")