aprendago
aprendago copied to clipboard
Exercício: Capítulo 11, Exercício 2 (Nível: 5)
Exercício: Capítulo 11, Exercício 2 (Nível: 5)
Use esta thread para compartilhar sua solução, discutir o exercício com os colegas e pedir ajuda caso tenha dificuldades!
Esse exercício foi o primeiro que tive que dar uma colada, lembrei como criar o map, mas não lembrava como atribuir os valores e ainda mais usando o type diferente ajudou a confundir um pouco mais kkkk. Terei que revisar o mesmo por alguns dias até fixar bem o conteúdo.
https://play.golang.org/p/HcPKmDvh_qB
https://play.golang.org/p/l0NKoutQ4RA
package main
import (
"fmt"
)
type pessoa struct {
nome, sobrenome string
sabores []string
}
func main() {
m := make(map[string]pessoa)
m["barbosa"] = pessoa{
nome: "eduardo",
sobrenome: "barbosa",
sabores: []string{"abacate", "chocolate", "morango"},
}
m["Rocha"] = pessoa{
nome: "Maria",
sobrenome: "Rocha",
sabores: []string{"Maracuja", "Morango"},
}
for _, v := range m {
fmt.Println(v.nome)
for _, sabor := range v.sabores {
fmt.Println("\t", sabor)
}
}
}
Output
eduardo
abacate
chocolate
morango
Maria
Maracuja
Morango
Program exited.
Precisei voltar na aula de map, para lembrar como se cria um map com valores dentro. Depois, para acertar os tipos, foi na base da tentativa erro, até começar a tirar conclusões lógicas: o índex é uma string (e não algo como pessoa.sobrenome). pessoa.Sobrenome é uma string da pessoa1 e da pessoa 2 e claro, pessoa é um objeto. Então posso guardar objetos como valores de um mapa. Pra que outros alunos possam entender a diferença da iteração usando structs direto e usando structs com map, deixei as duas formas na solução. Tb não quis tentar usar funções, como o assunto ainda não foi ministrado, o desafio é tentar fazer sem. É como se estivesse numa ilha deserta e tivesse que construir uma jangada sem usar serrote.
package main
import "fmt"
type pessoa struct {
Nome string
Sobrenome string
sorveteFavoritos []string
}
func main() {
pessoa1 := pessoa{
Nome: "alan",
Sobrenome: "Santos",
sorveteFavoritos: []string{"chocolate", "banana"},
}
pessoa2 := pessoa{
Nome: "Henrique",
Sobrenome: "Beltrão",
sorveteFavoritos: []string{"limão", "pera"},
}
fmt.Println()
fmt.Println("Iterando via Struct")
fmt.Println("----------------------------")
pessoas := []pessoa{pessoa1, pessoa2}
for _, p := range pessoas {
fmt.Println(p.Nome, p.Sobrenome)
for _, s := range p.sorveteFavoritos {
fmt.Printf(" \t-%v\n", s)
}
}
fmt.Println()
fmt.Println("Iterando via MAP")
fmt.Println("----------------------------")
mapaPessoa := map[string]pessoa{
pessoa1.Sobrenome: pessoa1,
pessoa2.Sobrenome: pessoa2,
}
for k, v := range mapaPessoa {
fmt.Println(k)
for _, s := range v.sorveteFavoritos {
fmt.Printf("\t-%v\n", s)
}
}
}
Estou procurando escrever código mais arquiteturado possível, limpando a view (func main) e isolando em um função as responsabildades, ou seja, a criação de dados, criação da string para impressão dos dados e conversão para map do slice. Usei artificios da linguagem que ainda não vi nas aulas (recursão e string builder), mas achei importante para eu praticar o que aprendi com o códigos que me ensinaram e que me inspiraram. Talvez te ajude a evoluir também :)
https://play.golang.org/p/3lePKlUmfK_l
package main
import (
. "fmt"
"strings"
)
// person struct representation
type person struct {
firstname, lastname string
icecream_flavours []flavour
}
// flavour struct representation to
// compose person flavour preferences
type flavour struct {
name string
}
func main() {
//get people data to process
people := getpeopledata()
// get a map of people recursively
var collect = collectiontomap(0, people, map[string]person{})
// print all in map collection
for _, v := range collect {
Println(v.tostring())
}
}
// return a slice of person to process
func getpeopledata() []person {
//create a person with your's favorite flocours
p := person{
firstname: "Fulano A.",
lastname: "Pinheiro",
}
f := []flavour{
{name: "BlueBerry"},
{name: "Green Florest"},
{name: "Baca Baca"},
{name: "FlueBird Ice"},
}
p.icecream_flavours = f
// and more one
z := person{
firstname: "Beltrano C.",
lastname: "Souza",
icecream_flavours: []flavour{
{name: "TanDam"},
{name: "Lsd Percursion"},
{name: "Loki Orange"},
},
}
return []person{p, z}
}
// get a custom string of a person to print
func (p person) tostring() string {
s := Sprintf("%v, %v\n\t| Flavours:", p.lastname, p.firstname)
// get a custom string of your flavours and concat
// to return a complete string representation
return Sprintln(s, "\n", p.printflavours())
}
// get a custom string of flavours of a person
func (p person) printflavours() string {
var b strings.Builder
b.Grow(32)
for i, v := range p.icecream_flavours {
Fprintf(&b, "\t %v. %s;\n", i, v)
}
return b.String()
}
// return an conversion to map of slice of person
// this func call him recursively at last person on slice
func collectiontomap(counter int, collect []person, _map map[string]person) map[string]person {
if counter == len(collect) {
return _map
}
_map[collect[counter].lastname] = collect[counter]
counter++
// recursive with the entry data
return collectiontomap(counter, collect, _map)
}
Resultado:
Pinheiro, Fulano A.
| Flavours:
0. {BlueBerry};
1. {Green Florest};
2. {Baca Baca};
3. {FlueBird Ice};
Souza, Beltrano C.
| Flavours:
0. {TanDam};
1. {Lsd Percursion};
2. {Loki Orange};```
https://play.golang.org/p/WyXt0ldZyQk
package main
import (
"fmt"
)
type pessoa struct {
nome string
sobrenome string
sorvetes []string
}
func main() {
pessoa1 := pessoa{
nome: "Tomás",
sobrenome: "Almeida",
sorvetes: []string{"coco", "tapioca"},
}
pessoa2 := pessoa{
nome: "Evelyn",
sobrenome: "Perdigão",
sorvetes: []string{"belga", "chocolate meio amargo"},
}
pessoas := map[string]pessoa{
"Almeida": pessoa1,
"Perdigão": pessoa2,
}
for _, value := range pessoas {
fmt.Printf("Nome: %v, Sobrenome: %v\n", value.nome, value.sobrenome)
fmt.Println("Sorvetes favoritos:")
for _, sabor := range value.sorvetes {
fmt.Println("\t", sabor)
}
}
}
https://go.dev/play/p/ZKWPezYz0yg
Cap. 11 – Exercícios: Nível #5 – 2 https://go.dev/play/p/PfFdGlfci-u
https://go.dev/play/p/NPIo9OSZZAq
Achei esse ex muito bom, show professora!
package main
import "fmt"
type pessoa struct {
Nome string
Sobrenome string
sabores []string
}
func main() {
pessoa1 := pessoa{
Nome: "Udson",
Sobrenome: "Willams",
sabores: []string{"chocolá", "morango"},
}
pessoa2 := pessoa{"33213", "Maria", []string{"balnilha", "morango"}}
fmt.Print(pessoa1, pessoa2)
map_pessoa := map[string]pessoa{
pessoa1.Sobrenome: pessoa1,
pessoa2.Sobrenome: pessoa2,
}
for k, v := range map_pessoa {
fmt.Printf("\nchave: %v | com pessoa: %v", k, v)
for _, value := range v.sabores {
fmt.Printf("\nsabores preferidos: %v", value)
}
}
fmt.Println()
}
https://go.dev/play/p/VOwIHWxtfdX