vkorbes / aprendago

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

Exercício: Capítulo 11, Exercício 2 (Nível: 5) #38

Open vkorbes opened 4 years ago

vkorbes commented 4 years ago

Exercício: Capítulo 11, Exercício 2 (Nível: 5)

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 4 years ago

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

ph-py commented 3 years ago

Para criar o map, raciocinei um pouco diferente nesta questão

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

an4kein commented 3 years ago

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.
alansantosmg commented 3 years ago

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)
        }
    }

}
guiganzer commented 3 years ago

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};```
Lucasmirandar commented 3 years ago

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

tomashugo commented 2 years ago
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)
        }
    }
}
viniciussanchez commented 2 years ago

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

wfrsilva commented 2 years ago

Cap. 11 – Exercícios: Nível #5 – 2 https://go.dev/play/p/PfFdGlfci-u

image

Harsgaard commented 1 year ago

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

UdsonWillams commented 5 months ago

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()
}
DominMFD commented 4 months ago

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