Comprensión de la modificación de valores con punteros en Go
En Go, los punteros permiten el acceso indirecto y la modificación de valores. Sin embargo, comprender cómo funcionan los punteros es crucial al pasarlos a funciones.
Al pasar un puntero a una función, surgen dos escenarios: modificación de valor versus reasignación de puntero.
Escenario 1 : Modificación de valor
Considere este código:
type Test struct { Value int }
func main() {
var i Test = Test {2}
var p *Test = &i
f(p)
println(i.Value) // 4
}
func f(p *Test) {
*p = Test{4}
}
Aquí, la función f recibe un puntero a la estructura de prueba. Dentro de f, al puntero desreferenciado (*p) se le asigna una nueva estructura de prueba con un valor de 4. Esto modifica efectivamente la estructura i original en la función principal, y el resultado es 4.
Escenario 2: Reasignación de puntero
Ahora, cambiemos ligeramente el código:
type Test struct { Value int }
func main() {
var i Test = Test {2}
var p *Test = &i
f(p)
println(i.Value) // 2
}
func f(p *Test) {
// ?
p = &Test{4}
}
En este caso, en lugar de modificar el valor señalado, la función reasigna el puntero p a una nueva estructura de prueba con un valor de 4. Dado que p es una variable local dentro de f, este cambio no afecta la estructura i original en la función principal, y la salida permanece 2.
Solución: Modificar el valor puntiagudo
Para modificar el valor puntiagudo, debemos desreferenciar el puntero y directamente acceda al miembro de la estructura:
type Test struct { Value int }
func main() {
var i Test = Test {2}
var p *Test = &i
f(p)
println(i.Value) // 4
}
func f(p *Test) {
p.Value = 4
}
Al usar p.Value, modificamos el campo Valor de la estructura original, lo que da como resultado un resultado de 4.
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