"Si un trabajador quiere hacer bien su trabajo, primero debe afilar sus herramientas." - Confucio, "Las Analectas de Confucio. Lu Linggong"
Página delantera > Programación > ¿Por qué mi método GO no modifica el valor de la instancia a menos que use un receptor de puntero?

¿Por qué mi método GO no modifica el valor de la instancia a menos que use un receptor de puntero?

Publicado el 2025-02-06
Navegar:240

Why Doesn't My Go Method Modify the Instance Value Unless I Use a Pointer Receiver?

Golang Método con Pointer receptor

al intentar modificar el valor de una instancia a través de un método, es crucial comprender el concepto de puntero receptores. En este ejemplo, el método setSomefield no funciona como se esperaba porque su receptor no es de tipo puntero.

para rectificar esto, modificamos el método setSomefield para aceptar un receptor de puntero de la siguiente manera:

func (i *Implementation) SetSomeField(newValue string) {
    ...
}

Sin embargo, este cambio introduce un nuevo problema: la estructura ya no implementa la interfaz porque el método getSomefield todavía tiene un receptor de valor.

la solución radica en usar un puntero a la estructura cuando Implementación de la interfaz. Al hacerlo, habilitamos el método para modificar la instancia real sin crear una copia. Aquí está el código modificado:

type IFace interface {
    SetSomeField(newValue string)
    GetSomeField() string
}

type Implementation struct {
    someField string
}

func (i *Implementation) GetSomeField() string {
    return i.someField
}

func (i *Implementation) SetSomeField(newValue string) {
    i.someField = newValue
}

func Create() *Implementation {
    return &Implementation{someField: "Hello"}
}

func main() {
    var a IFace
    a = Create()
    a.SetSomeField("World")
    fmt.Println(a.GetSomeField())
}

En este código actualizado, la función Crear devuelve un puntero a la estructura de implementación, que implementa la interfaz IFACE. En consecuencia, la variable de tipo IFACE puede referirse al puntero a la estructura de implementación, lo que permite que el método setSomefield modifique su valor.

Último tutorial Más>

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