"Se um trabalhador quiser fazer bem o seu trabalho, ele deve primeiro afiar suas ferramentas." - Confúcio, "Os Analectos de Confúcio. Lu Linggong"
Primeira página > Programação > Como posso modificar uma fatia passada como argumento de função no Go?

Como posso modificar uma fatia passada como argumento de função no Go?

Publicado em 2024-12-20
Navegar:967

How Can I Modify a Slice Passed as a Function Argument in Go?

Passando uma fatia como um argumento de função e modificando a fatia original

No Go, a passagem de argumentos para funções é feita por valor, o que significa que quaisquer alterações feitas no argumento dentro da função não são refletidos na variável original. Isso pode se tornar problemático ao trabalhar com tipos de dados mutáveis, como fatias, pois anexar à fatia dentro da função não afetará a fatia original além do escopo da função.

Considere o seguinte exemplo:

nums := []int{1, 2, 3}

func addToNumbs(nums []int) []int {
    nums = append(nums, 4)
    fmt.Println(nums) // []int{1, 2, 3, 4}
}

fmt.Println(nums) // []int{1, 2, 3}

Neste exemplo, a função AddToNumbs pega uma cópia da fatia nums e anexa o valor 4. Isso modifica apenas a cópia dentro a função, e a fatia nums original permanece inalterada fora da função.

Para resolver esse problema, você precisa passar a fatia por referência. Uma maneira de fazer isso é passando um ponteiro para a fatia:

func myAppend(list *[]string, value string) {
    *list = append(*list, value)
}

Ao passar um ponteiro para a fatia, quaisquer alterações feitas na função são refletidas diretamente na fatia original. No entanto, passar um ponteiro também significa que a função pode modificar a fatia de maneiras que você não espera, por isso é importante usar ponteiros com cuidado.

Outra alternativa é retornar a fatia modificada da função, conforme demonstrado no exemplo a seguir:

func validate(obj Validatable, messages []ValidationMessage) []ValidationMessage {
    // Append to the accumulator and return it directly
    messages = append(messages, message)
    return messages
}

Nesse caso, a função de validação retorna a fatia de mensagens modificada, eliminando a necessidade de passar um ponteiro para a fatia.

Tutorial mais recente Mais>

Isenção de responsabilidade: Todos os recursos fornecidos são parcialmente provenientes da Internet. Se houver qualquer violação de seus direitos autorais ou outros direitos e interesses, explique os motivos detalhados e forneça prova de direitos autorais ou direitos e interesses e envie-a para o e-mail: [email protected]. Nós cuidaremos disso para você o mais rápido possível.

Copyright© 2022 湘ICP备2022001581号-3