vkorbes / aprendago

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

Exercício: Capítulo 15, Exercício 2 (Nível: 7) #53

Open vkorbes opened 3 years ago

vkorbes commented 3 years ago

Exercício: Capítulo 15, Exercício 2 (Nível: 7)

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

Me atrapalhei um pouco na hora de passar o ponteiro estava usando o "*" ao invés de "&", mas no final deu certo kkk

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

an4kein commented 3 years ago

https://play.golang.org/p/hbHisF-YnYg

package main

import "fmt"

/* - Crie um struct "pessoa"
- Crie uma função chamada mudeMe que tenha *pessoa como parâmetro. 
 Essa função deve mudar um valor armazenado no endereço *pessoa.
    - Dica: a maneira "correta" para fazer dereference de um valor em um struct seria (*valor).campo
    - Mas consta uma exceção na documentação. Link: https://golang.org/ref/spec#Selectors​
    - "As an exception, if the type of x is a named pointer type and (*x).f is a valid selector expression 
   denoting a field   (but not a  method),
    - → x.f is shorthand for (*x).f." ←
    - Ou seja, podemos usar tanto o atalho p1.nome quanto o tradicional (*p1).nome
- Crie um valor do tipo pessoa;
- Use a função mudeMe e demonstre o resultado.
*/

type Pessoa struct {
    nome string
}

func mudeMe(p Pessoa) string {
    novoNome := &p.nome
    *novoNome = "eduardo"

    return p.nome
}

func main() {
    colaborador := Pessoa{
        nome: "anakein",
    }

    fmt.Println(mudeMe(colaborador))
}

Output

eduardo

Program exited.
an4kein commented 3 years ago

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

Realizei alguns ajustes, me fez fixar melhor em relacao o retorno de uma funcao

package main

import (
    "fmt"
)

/* - Crie um struct "pessoa"
- Crie uma função chamada mudeMe que tenha *pessoa como parâmetro. Essa função deve mudar um valor armazenado no endereço *pessoa.
    - Dica: a maneira "correta" para fazer dereference de um valor em um struct seria (*valor).campo
    - Mas consta uma exceção na documentação. Link: https://golang.org/ref/spec#Selectors​
    - "As an exception, if the type of x is a named pointer type and (*x).f is a valid selector expression denoting a field (but not a  method),
    - → x.f is shorthand for (*x).f." ←
    - Ou seja, podemos usar tanto o atalho p1.nome quanto o tradicional (*p1).nome
- Crie um valor do tipo pessoa;
- Use a função mudeMe e demonstre o resultado.
*/

type Pessoa struct {
    nome      string
    sobrenome string
    idade     int
    trabalha  bool
}

func mudeMe(p Pessoa) string {
    novoNome := &p.nome
    *novoNome = "eduardo"
    dados := fmt.Sprintf("Novo nome: %v\nSobrenome: %s\nIdade: %d\nTrabalha?: %t", *novoNome, p.sobrenome, p.idade, p.trabalha)
    return dados
}

func main() {
    colaborador := Pessoa{
        nome:      "anakein",
        sobrenome: "ank",
        idade:     1337,
        trabalha:  false,
    }
    fmt.Println(mudeMe(colaborador))
}

Output

Novo nome: eduardo
Sobrenome: ank
Idade: 1337
Trabalha?: false

Program exited.
alansantosmg commented 3 years ago

Muito bom esse exercicio. Me mostrou na prática a utilidade dos ponteiros.


package main

import "fmt"

type pessoa struct {
    nome      string
    sobrenome string
}

func main() {

    p1 := pessoa{"alan", "Santos"}
    fmt.Println(p1)

    mudeMe(&p1)
    fmt.Println(p1)
}

func mudeMe(p *pessoa) {

    p.nome = "Zarlan" // prefiro esta notação
    (*p).sobrenome = "Zantos"  
}
wfrsilva commented 2 years ago

Cap. 15 – Exercícios: Nível #7 – 2 https://go.dev/play/p/fTZqqRMZESS

image

Harsgaard commented 1 year ago

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

UdsonWillams commented 2 months ago
package main

import "fmt"

type Pessoa struct {
    nome      string
    sobrenome string
    idade     int
}

// Ideia que tive
func MudeMe_1(p Pessoa) Pessoa {
    pointer := &p.nome
    *pointer = "Um Novo Nome lhe foi dado"
    return p
}

// Formato passado pela professora.
func MudeMe_2(p *Pessoa) *Pessoa {
    (*p).nome = "Um Novo Nome lhe foi dado"
    return p
}

// Formato passado pela professora que a linguagem diz que também é aceitavel.
func MudeMe_3(p *Pessoa) *Pessoa {
    p.nome = "Um Novo Nome lhe foi dado"
    return p
}

func main() {

    pessoa1 := Pessoa{"Udson", "Willams", 27}
    pessoa2 := Pessoa{"João", "Maria", 27}
    pessoa3 := Pessoa{"Fernando", "Sousza", 27}

    fmt.Println(pessoa1)
    fmt.Println(pessoa2)
    fmt.Println(pessoa3)
    fmt.Println("Endereço das pessoas 1, 2 e 3")
    fmt.Println(&pessoa1.nome, &pessoa2.nome, &pessoa3.nome)

    fmt.Println("---------------------------------------------")

    mudeme_1 := MudeMe_1(pessoa1)
    mudeme_2 := MudeMe_2(&pessoa2)
    mudeme_3 := MudeMe_3(&pessoa3)

    fmt.Println(mudeme_1)  // DO tipo pessoa
    fmt.Println(*mudeme_2) // Tipo ponteiro de pessoa
    fmt.Println(*mudeme_3) // Tipo ponteiro de pessoa
    fmt.Println("Endereço de pessoas 1, 2 e 3")
    fmt.Println(&pessoa1.nome, &pessoa2.nome, &pessoa3.nome)
}
thiagoCalazans-dev commented 1 month ago

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

import "fmt"

/*- Crie um struct "pessoa"
- Crie uma função chamada mudeMe que tenha *pessoa como parâmetro. Essa função deve mudar um valor armazenado no endereço *pessoa.
    - Dica: a maneira "correta" para fazer dereference de um valor em um struct seria (*valor).campo
    - Mas consta uma exceção na documentação. Link: https://golang.org/ref/spec#Selectors
    - "As an exception, if the type of x is a named pointer type and (*x).f is a valid selector expression denoting a field (but not a method),
    - → x.f is shorthand for (*x).f." ←
    - Ou seja, podemos usar tanto o atalho p1.nome quanto o tradicional (*p1).nome
- Crie um valor do tipo pessoa;
- Use a função mudeMe e demonstre o resultado.*/

type pessoa struct {
    name string
    age  int64
}

func main() {
    pessoa1 := pessoa{name: "luigi", age: 14}
    fmt.Println(pessoa1)
    mudeMe(&pessoa1)
    fmt.Println(pessoa1)
}

func mudeMe(p *pessoa) {
    p.name = "mario"
    p.age = 15
}