¿Cómo agregar un método al tipo de estructura en Golang?

Las estructuras consisten en datos, pero aparte de esto, las estructuras también informan sobre el comportamiento en forma de métodos. Los métodos adjuntos a estructuras son muy similares a la definición de funciones normales, la única variación es que necesita especificar adicionalmente su tipo.

Se vería una función normal que devuelve un número entero y no toma ningún parámetro.

func function_name() int {
    //code
}

Se vería asociar la función mencionada anteriormente con el tipo type_name().

type type_name struct { }
func (m type_name) function_name() int {
    //code
}

En el siguiente código, se agrega una función Area() a una estructura Rect. Aquí, Area() está trabajando explícitamente con el tipo Rect con func (re Rect) Area() int

Ejemplo:

package main
  
import "fmt"
  
// taking a struct
type Rect struct {
    len, wid int
}
  
func (re Rect) Area() int {
    return re.len * re.wid
}
  
func main() {
    r := Rect{10, 12}
    fmt.Println("Length and Width are:", r)
    fmt.Println("Area of Rectangle: ", r.Area())
}

Producción:

Length and Width are: {10, 12}
Area of Rectangle: 120

El lenguaje Go no usa palabras clave como esta o self , más bien, en el lenguaje Go, cuando define un método asociado con un tipo, se proporciona como una variable con nombre (r Rect) (por ejemplo, en el caso anterior) y luego dentro se utiliza ese método re variable.

En el código anterior, la instancia de Rect se pasa como un valor para llamar al método Area(). También puedes pasarlo por referencia . No habrá diferencia en llamar al método si la instancia que está usando para llamarlo es un puntero o un valor, Go automáticamente hará la conversión por usted.

package main
  
import "fmt"
  
// taking a struct
type Rect struct {
    len, wid int
}
  
func (re Rect) Area_by_value() int {
    return re.len * re.wid
}
  
func (re *Rect) Area_by_reference() int {
    return re.len * re.wid
}
  
// main function
func main() {
    r := Rect{10, 12}
    fmt.Println("Length and Width is:", r)
    fmt.Println("Area of Rectangle is:", r.Area_by_value())
    fmt.Println("Area of Rectangle is:", r.Area_by_reference())
    fmt.Println("Area of Rectangle is:", (&r).Area_by_value())
    fmt.Println("Area of Rectangle is:", (&r).Area_by_reference())
}

Producción:

Length and Width is: {10, 12}
Area of Rectangle is: 120
Area of Rectangle is: 120
Area of Rectangle is: 120
Area of Rectangle is: 120

En el código anterior, definimos dos métodos similares, uno toma la instancia (Rect) como un puntero y otro lo toma por valor. Ambos métodos se llaman a través de un valor r y como una dirección &r. Pero dado que Go realiza las conversiones adecuadas, muestra los mismos resultados.

Publicación traducida automáticamente

Artículo escrito por nikki2398 y traducido por Barcelona Geeks. The original can be accessed here. Licence: CCBY-SA

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *