vkorbes / aprendago

Curso completo em português da linguagem Go, de zero a ninja! 🇧🇷
http://aprendago.com
1k stars 179 forks source link

Exercício: Capítulo 9, Exercício 6 (Nível: 4) #32

Open vkorbes opened 3 years ago

vkorbes commented 3 years ago

Exercício: Capítulo 9, Exercício 6 (Nível: 4)

Link para o vídeo:

Use esta thread para compartilhar sua solução, discutir o exercício com os colegas e pedir ajuda caso tenha dificuldades!

diegoparra commented 3 years ago

https://play.golang.org/p/5ImpADhNsW7

haystem commented 3 years ago
package main

import("fmt")

func main(){
  estados:= make([]string,15,20)
  estados = []string{
    "Acre", 
    "Alagoas",
    "Amapá", 
    "Amazonas",
    "Bahia", 
    "Ceará", 
    "Espírito Santo", 
    "Goiás", 
    "Maranhão", 
    "Mato Grosso",
    "Mato Grosso do Sul",
  }
  estados = append(estados,"Minas Gerais", "Pará", "Paraíba", 
  "Paraná", "Pernambuco", "Piauí", "Rio de Janeiro", 
  "Rio Grande do Norte", "Rio Grande do Sul", "Rondônia", 
  "Roraima", "Santa Catarina", "São Paulo", "Sergipe", "Tocantins" )

  fmt.Println(len(estados),cap(estados))

for x:=0; x < len(estados);x++{
  fmt.Println(estados[x])
}

}
ghtms commented 3 years ago

Olá, se aumentarmos a capacidade do slice no make, a mesma não deveria ser informada no print? ex. colocar cap 100 no make e na hora do print, o cap deve mostrar 100

Aparentemente, nas respostas apresentadas, quando em seguida ao make fazemos o slice literal, está a assumir o cap baseado no len desse slice e qualquer alteração na chamada do make (len ou cap) não são levados em consideração.

fiz um exemplo onde ao se mudar os valores do make, o mesmo reflete no restante do código

make com um valor de cap maior q o len https://play.golang.org/p/vcQLafr-Fuu

make com valor igual ao len e que ao adicionar mais 1 valor, o cap é aumentado automaticamente. https://play.golang.org/p/ILl6gldDxZ7

faz sentido?

an4kein commented 3 years ago

https://play.golang.org/p/rUulSziMvnA

Observei que podemos começar o  length and capacity com 0 zero, se não soubermos a quantidade de dados que nossa slice vai receber.

package main

import (
    "fmt"
)

func main() {
    estados := make([]string, 0, 0)
    fmt.Println("length before: ", len(estados))
    fmt.Println("capacity before: ",cap(estados))
    fmt.Println("")
    estados = append(estados, "Acre", "Alagoas", "Amapá", "Amazonas", "Bahia", "Ceará", "Espírito Santo", "Goiás", "Maranhão", "Mato Grosso", "Mato Grosso do Sul", "Minas Gerais", "Pará", "Paraíba", "Paraná", "Pernambuco", "Piauí", "Rio de Janeiro", "Rio Grande do Norte", "Rio Grande do Sul", "Rondônia", "Roraima", "Santa Catarina", "São Paulo", "Sergipe", "Tocantins")
    fmt.Println(estados)
    fmt.Println("")
    fmt.Println("length after: ",len(estados))
    fmt.Println("capacity after: ",cap(estados))
    fmt.Println("")
    for i := 0; i < len(estados); i++ {
        fmt.Println(estados[i])
    }

}

Output

length before:  0
capacity before:  0

[Acre Alagoas Amapá Amazonas Bahia Ceará Espírito Santo Goiás Maranhão Mato Grosso Mato Grosso do Sul Minas Gerais Pará Paraíba Paraná Pernambuco Piauí Rio de Janeiro Rio Grande do Norte Rio Grande do Sul Rondônia Roraima Santa Catarina São Paulo Sergipe Tocantins]

length after:  26
capacity after:  26

Acre
Alagoas
Amapá
Amazonas
Bahia
Ceará
Espírito Santo
Goiás
Maranhão
Mato Grosso
Mato Grosso do Sul
Minas Gerais
Pará
Paraíba
Paraná
Pernambuco
Piauí
Rio de Janeiro
Rio Grande do Norte
Rio Grande do Sul
Rondônia
Roraima
Santa Catarina
São Paulo
Sergipe
Tocantins

Program exited.
alansantosmg commented 3 years ago

My solution:

package main

import "fmt"

func main() {

    estados := make([]string, 26)

    estados = []string{"Acre", "Alagoas", "Amapá", "Amazonas", "Bahia", "Ceará", "Espírito Santo", "Goiás", "Maranhão", "Mato Grosso", "Mato Grosso do Sul", "Minas Gerais", "Pará", "Paraíba", "Paraná", "Pernambuco", "Piauí", "Rio de Janeiro", "Rio Grande do Norte", "Rio Grande do Sul", "Rondônia", "Roraima", "Santa Catarina", "São Paulo", "Sergipe", "Tocantins"}

    for i := 0; i < len(estados); i++ {

        fmt.Println(estados[i])
    }

    fmt.Println("Len: ", len(estados), "Cap: ", cap(estados))

}
alansantosmg commented 3 years ago

Se eu não souber quantos dados vou colocar no slice, então eu não preciso criá-lo com make. Entendi que o make é justamente para que eu possa controlar o len e o cap. Pelo que li da documentação, quando o comprimento dos dados (len) excedem o cap (ao fazer um append), Go dobra o cap.

Lucasmirandar commented 3 years ago

https://play.golang.org/p/MUR7HgbkZVA

andersoncleyson commented 2 years ago
package main

import "fmt"

func main() {
    slice := make([]string, 26, 26)

    slice = []string{"Acre", "Alagoas", "Amapá", "Amazonas", "Bahia", "Ceará",
        "Espírito Santo", "Goiás", "Maranhão", "Mato Grosso",
        "Mato Grosso do Sul", "Minas Gerais", "Pará", "Paraíba",
        "Paraná", "Pernambuco", "Piauí", "Rio de Janeiro",
        "Rio Grande do Norte", "Rio Grande do Sul", "Rondônia",
        "Roraima", "Santa Catarina", "São Paulo", "Sergipe", "Tocantins"}

    fmt.Println(len(slice), cap(slice))

    for i := 1; i <= len(slice)-1; i++ {
        fmt.Println(slice[i])
    }
}
tomashugo commented 2 years ago
package main

import (
    "fmt"
)

func main() {
    estados := make([]string, 0, 54)
    estados = append(estados, "Acre", "Alagoas", "Amapá", "Amazonas", "Bahia", "Ceará", "Espírito Santo", "Goiás", "Maranhão", "Mato Grosso", "Mato Grosso do Sul", "Minas Gerais", "Pará", "Paraíba", "Paraná", "Pernambuco", "Piauí", "Rio de Janeiro", "Rio Grande do Norte", "Rio Grande do Sul", "Rondônia", "Roraima", "Santa Catarina", "São Paulo", "Sergipe", "Tocantins")
    fmt.Println(len(estados), cap(estados))

    for i := 0; i < len(estados); i++ {
        fmt.Println(estados[i])
    }
}
viniciussanchez commented 2 years ago

https://go.dev/play/p/II0Q-imj_HY

AlissonAp commented 2 years ago

https://go.dev/play/p/nGArBHBemU7

wfrsilva commented 2 years ago

Cap. 9 – Exercícios: Nível #4 – 6 https://go.dev/play/p/YBMVuE8hUdX

image

Levison-Jr commented 1 year ago

Adicionando os nomes dos estados com um append, ao invés de reatribuindo os valores ao slice, o array subjacente continua o mesmo (desde que não exceda sua capacidade estabelecida no make), evitando assim o custo computacional adicional de se criar outro array subjacente.

Para entender melhor, no código abaixo o slice criado tem capacidade 30, e usando o append, como a capacidade não é ultrapassada, a capacidade continua a mesma. Ou seja, o array subjacente não mudou.

Caso, ao invés de fazer com o append, fazer a reatribuição com estados = []string{...}, ao se verificar a capacidade, será exibida a capacidade igual ao length. Logo, o array subjacente não é mais o mesmo do que foi criado usando o make anteriormente. Para testar, copiando o código abaixo ou pelo link, basta comentar o slice criado a partir do append, e tirar o comentário do que foi criado pela reatribuição. https://go.dev/play/p/EF_OH7gjSkC

Essa observação foi feita em um comentário do vídeo, pelo Ronan, e notando fiz também os testes, mas realizando a adição dos elementos de um modo (append) diferente do sugerido lá. Sou iniciante na linguagem, não sei se tudo que comentei aqui faz sentido, mas deixo também observação.

No mais, deixo meu agradecimento à professora. Obrigado pelo curso Ellen, está muito bom mesmo.

package main

import "fmt"

func main() {
    estados := make([]string, 0, 30)

    //Usando o append
    estados = append(estados, "Acre", "Alagoas", "Amapá", "Amazonas", "Bahia", "Ceará", "Espírito Santo", "Goiás", "Maranhão", "Mato Grosso", "Mato Grosso do Sul", "Minas Gerais", "Pará", "Paraíba", "Paraná", "Pernambuco", "Piauí", "Rio de Janeiro", "Rio Grande do Norte", "Rio Grande do Sul", "Rondônia", "Roraima", "Santa Catarina", "São Paulo", "Sergipe", "Tocantins")

    //Reatribuindo
    //estados = []string{"Acre", "Alagoas", "Amapá", "Amazonas", "Bahia", "Ceará", "Espírito Santo", "Goiás", "Maranhão", "Mato Grosso", "Mato Grosso do Sul", "Minas Gerais", "Pará", "Paraíba", "Paraná", "Pernambuco", "Piauí", "Rio de Janeiro", "Rio Grande do Norte", "Rio Grande do Sul", "Rondônia", "Roraima", "Santa Catarina", "São Paulo", "Sergipe", "Tocantins"}

    fmt.Printf("len: %v || cap: %v\n\n", len(estados), cap(estados))

    for i := 0; i < len(estados); i++ {
        fmt.Println(i+1, ":", estados[i])
    }
}
M3L1M commented 1 year ago

func main() { estados := make([]string, 26, 26) estados = []string{ "Acre", "Alagoas", "Amapá", "Amazonas", "Bahia", "Ceará", "Espírito Santo", "Goiás", "Maranhão", "Mato Grosso", "Mato Grosso do Sul", "Minas Gerais", "Pará", "Paraíba", "Paraná", "Pernambuco", "Piauí", "Rio de Janeiro", "Rio Grande do Norte", "Rio Grande do Sul", "Rondônia", "Roraima", "Santa Catarina", "São Paulo", "Sergipe", "Tocantins"}

fmt.Println(len(estados))
fmt.Println(cap(estados))

for i := 0; i < len(estados); i++ {
    fmt.Println(estados[i])
}

}

adelsonsljunior commented 1 year ago
package main

import (
    "fmt"
)

func main() {

    estados := make([]string, 26, 26)

    estados = []string{
        "Acre", "Alagoas", "Amapá", "Amazonas", "Bahia", "Ceará",
        "Espírito Santo", "Goiás", "Maranhão", "Mato Grosso",
        "Mato Grosso do Sul", "Minas Gerais", "Pará", "Paraíba",
        "Paraná", "Pernambuco", "Piauí", "Rio de Janeiro",
        "Rio Grande do Norte", "Rio Grande do Sul", "Rondônia",
        "Roraima", "Santa Catarina", "São Paulo", "Sergipe", "Tocantins"}

    for i := 0; i < len(estados); i++ {
        fmt.Println(estados[i])
    }

}
binariarvore commented 8 months ago
package main

import "fmt"

func main() {
    estados := make([]string, 26, 26)
    valores := []string{"Acre", "Alagoas", "Amapá", "Amazonas", "Bahia", "Ceará", 
              "Espírito Santo", "Goiás", "Maranhão", "Mato Grosso", "Mato Grosso do Sul",
              "Minas Gerais", "Pará", "Paraíba", "Paraná", "Pernambuco", "Piauí", "Rio de Janeiro", 
              "Rio Grande do Norte", "Rio Grande do Sul",
          "Rondônia", "Roraima", "Santa Catarina", "São Paulo", "Sergipe", "Tocantins"}

    for i, v := range valores {
        if i < len(estados) {
            estados[i] = v
        }
    }

    fmt.Println(len(estados), cap(estados))
    fmt.Println(estados[:])
}
DominMFD commented 2 months ago

https://go.dev/play/p/Nz95mjlcWqz

thiagoCalazans-dev commented 2 months ago

// You can edit this code!
// Click here and start typing.
package main

import "fmt"

//- Crie uma slice usando make que possa conter todos os estados do Brasil.
//    - Os estados: "Acre", "Alagoas", "Amapá", "Amazonas", "Bahia", "Ceará", "Espírito Santo", "Goiás", "Maranhão", "Mato Grosso", "Mato Grosso do Sul", "Minas Gerais", "Pará", "Paraíba", "Paraná", "Pernambuco", "Piauí", "Rio de Janeiro", "Rio Grande do Norte", "Rio Grande do Sul", "Rondônia", "Roraima", "Santa Catarina", "São Paulo", "Sergipe", "Tocantins"
//- Demonstre o len e cap da slice.
//- Demonstre todos os valores da slice sem utilizar range.

func main() {
    slice := []string{"Acre", "Alagoas", "Amapá", "Amazonas", "Bahia", "Ceará", "Espírito Santo", "Goiás", "Maranhão", "Mato Grosso", "Mato Grosso do Sul", "Minas Gerais", "Pará", "Paraíba", "Paraná", "Pernambuco", "Piauí", "Rio de Janeiro", "Rio Grande do Norte", "Rio Grande do Sul", "Rondônia", "Roraima", "Santa Catarina", "São Paulo", "Sergipe", "Tocantins"}
    makeSlice := make([]string, len(slice), len(slice))
    makeSlice = []string{"Acre", "Alagoas", "Amapá", "Amazonas", "Bahia", "Ceará", "Espírito Santo", "Goiás", "Maranhão", "Mato Grosso", "Mato Grosso do Sul", "Minas Gerais", "Pará", "Paraíba", "Paraná", "Pernambuco", "Piauí", "Rio de Janeiro", "Rio Grande do Norte", "Rio Grande do Sul", "Rondônia", "Roraima", "Santa Catarina", "São Paulo", "Sergipe", "Tocantins"}

    fmt.Println(makeSlice, len(makeSlice), cap(makeSlice))

}```