aprendago
aprendago copied to clipboard
Exercício: Capítulo 9, Exercício 6 (Nível: 4)
Exercício: Capítulo 9, Exercício 6 (Nível: 4)
Use esta thread para compartilhar sua solução, discutir o exercício com os colegas e pedir ajuda caso tenha dificuldades!
https://play.golang.org/p/5ImpADhNsW7
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])
}
}
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?
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.
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))
}
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.
https://play.golang.org/p/MUR7HgbkZVA
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])
}
}
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])
}
}
https://go.dev/play/p/II0Q-imj_HY
https://go.dev/play/p/nGArBHBemU7
Cap. 9 – Exercícios: Nível #4 – 6 https://go.dev/play/p/YBMVuE8hUdX
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])
}
}
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])
}
}
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])
}
}
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[:])
}
https://go.dev/play/p/Nz95mjlcWqz
// 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))
}```