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.