1
resposta

Questão 7: Um pouco mais sobre struct

Eu acho que as alternativas corretas são as B e C, como vi que a questão exigia 3 opções, cliquei na alternativa D e segundo a a questão a alternativa A estaria correta e segundo essa questão seria A, B e C as alternativas corretas.

Não acho que a alternativa A esteja correta porque os valores de uma struct pode ser alterado, mas depende se a struct passada foi por referência ou cópia, se for cópia a alteração não afeta a original, então teoricamente, não alteraria e por isso (como não tem contexto) acho que as alternativas corretas seriam B e C.

1 resposta

Olá Murilo, tudo bem com você?

A alternativa A, diz que: "qualquer valor armazenado em uma struct, pode ser alterado." Essa afirmação está correta no sentido de que, em Go, é possível modificar os valores dos campos de uma struct, desde que você tenha acesso a uma instância modificável dessa struct. Porém, como você bem mencionou, há um ponto importante: se a struct for passada por cópia, as alterações não afetam a struct original, mas apenas a cópia. Isso não significa que os valores não podem ser alterados — eles podem ser modificados na cópia. Exemplo:

package main

import "fmt"

type Pessoa struct {
    Nome  string
    Idade int
}

func alteraIdadePorCopia(p Pessoa) {
    p.Idade = 30                                                       // Modifica a cópia, mas não a original
    fmt.Println("Dentro da função (cópia) - Idade alterada:", p.Idade) // Mostra a alteração na cópia
}

func alteraIdadePorReferencia(p *Pessoa) {
    p.Idade = 30                                                            // Modifica a struct original
    fmt.Println("Dentro da função (referência) - Idade alterada:", p.Idade) // Mostra a alteração na original
}

func main() {
    p1 := Pessoa{Nome: "João", Idade: 20}

    fmt.Println("Antes de passar para a função (original) - Idade:", p1.Idade)
    alteraIdadePorCopia(p1)
    fmt.Println("Após a função (cópia) - Idade:", p1.Idade) // Continua sendo 20, pois foi passado por cópia

    alteraIdadePorReferencia(&p1)
    fmt.Println("Após a função (referência) - Idade:", p1.Idade) // Agora é 30, pois foi passado por referência
}

Neste exemplo temos que:

  • Quando passamos a struct por cópia, as alterações não afetam a instância original.
  • Quando passamos por referência (usando ponteiros), as alterações refletem na struct original.

Portanto, a alternativa A está correta, pois os valores de uma struct podem ser alterados, mas é fundamental entender como a struct está sendo manipulada (cópia ou referência). Esse detalhe não invalida a afirmação, apenas adiciona contexto.

As alternativas B e C também estão corretas, como você já identificou. A alternativa D está incorreta porque afirma que uma struct é uma coleção de variáveis do mesmo tipo, o que não é verdade, já que uma struct pode conter campos de diferentes tipos, como mostro abaixo:

type Produto struct {
    Nome   string
    Preco  float64
    EmEstoque bool
}

Espero ter ajudado. Conte com o apoio do Fórum na sua jornada. Fico à disposição. Abraços e bons estudos!

Caso este post tenha lhe ajudado, por favor, marcar como solucionado