En Go, pasar argumentos a funciones se realiza por valor, lo que significa que cualquier cambio realizado en el argumento dentro de la función no se reflejan en la variable original. Esto puede resultar problemático cuando se trabaja con tipos de datos mutables, como sectores, ya que agregar el sector dentro de la función no afectará el sector original más allá del alcance de la función.
Considere el siguiente ejemplo:
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}
En este ejemplo, la función AddToNumbs toma una copia del segmento nums y agrega el valor 4. Esto modifica solo la copia dentro la función, y el segmento numérico original permanece sin cambios fuera de la función.
Para resolver este problema, debe pasar el segmento por referencia. Una forma de hacerlo es pasando un puntero al segmento:
func myAppend(list *[]string, value string) { *list = append(*list, value) }
Al pasar un puntero al sector, cualquier cambio realizado dentro de la función se refleja directamente en el sector original. Sin embargo, pasar un puntero también significa que la función puede modificar el segmento de maneras inesperadas, por lo que es importante usar los punteros con cuidado.
Otra alternativa es devolver el segmento modificado desde la función, como se demostró. en el siguiente ejemplo:
func validate(obj Validatable, messages []ValidationMessage) []ValidationMessage { // Append to the accumulator and return it directly messages = append(messages, message) return messages }
En este caso, la función de validación devuelve el segmento de mensajes modificado, eliminando la necesidad de pasar un puntero al segmento.
Descargo de responsabilidad: Todos los recursos proporcionados provienen en parte de Internet. Si existe alguna infracción de sus derechos de autor u otros derechos e intereses, explique los motivos detallados y proporcione pruebas de los derechos de autor o derechos e intereses y luego envíelos al correo electrónico: [email protected]. Lo manejaremos por usted lo antes posible.
Copyright© 2022 湘ICP备2022001581号-3