Modificación del puntero en Go, comprensión de las diferencias
En Go, cuando pasamos un puntero a una función, normalmente pretendemos modificar el valor señalado por ese puntero. Normalmente, esto se puede lograr mediante la eliminación de referencias, como se ilustra en el siguiente código:
type Test struct {
Value int
}
func main() {
i := Test{2}
p := &i
f(p)
println(i.Value) // Output: 4
}
func f(p *Test) {
*p = Test{4}
}
Sin embargo, puede haber casos en los que el valor de la estructura a la que apunta el puntero pasado permanezca sin cambios, incluso después de su modificación dentro de la función. Para comprender por qué ocurre esto, examinemos un fragmento de código modificado:
type Test struct {
Value int
}
func main() {
i := Test{2}
p := &i
f(p)
println(i.Value) // Output: 2
}
func f(p *Test) {
// Attempt to modify the pointer value
p = &Test{4}
}
Este fragmento de código intenta modificar el valor del puntero p, pero no logra cambiar el valor de la estructura a la que apunta originalmente. La razón de esto es que la asignación p = &Test{4} dentro de la función f() solo modifica el valor de la variable local p.
Dentro de la función f(), p se trata como una variable local , y asignarle un nuevo valor no afecta el valor del puntero pasado desde la función main(). En consecuencia, la estructura señalada por p permanece sin cambios, lo que se refleja en el valor sin cambios de i.Value cuando se imprime.
Por el contrario, el siguiente código demuestra el enfoque correcto para modificar el valor de la estructura:
type Test struct {
Value int
}
func main() {
i := Test{2}
p := &i
f(p)
println(i.Value) // Output: 4
}
func f(p *Test) {
p.Value = 4
}
En este código, p.Value = 4 modifica directamente el campo Valor de la estructura señalada por p. Esto da como resultado la modificación deseada del valor de la estructura, que se refleja en el valor actualizado de i.Value cuando se imprime.
Vale la pena señalar que asignar un nuevo valor al puntero mismo (como en p = &Test{ 4}) tiene un efecto diferente. Esta asignación crearía un nuevo puntero que apunta a una nueva estructura, pero no afectaría el valor de la estructura a la que apunta el puntero original pasado desde la función main().
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