Los métodos en Golang son como funciones pero con una diferencia importante: tienen un argumento receptor , que permite el acceso a las propiedades del receptor . El receptor puede ser de tipo struct o no struct, pero ambos deben estar en el mismo paquete. No es posible crear métodos para tipos definidos en otros paquetes, incluidos tipos integrados como int o string ; De lo contrario, el compilador informará un error.

Por ejemplo:
package main
import "fmt"
// Định nghĩa một struct
type person struct {
name string
age int
}
// Định nghĩa một phương thức với struct receiver
func (p person) display() {
fmt.Println("Name:", p.name)
fmt.Println("Age:", p.age)
}
func main() {
// Tạo một phiên bản của struct
a := person{name: "a", age: 25}
// Gọi phương thức
a.display()
}
Resultado:
Name: a
Age: 25
Sintaxis
func(receiver_name Type) method_name(parameter_list) (return_type) {
// Code
}
Receptor: Se puede acceder mediante este método.
Método con receptor de tipo estructura
En Go, puedes definir un método donde el receptor sea de tipo estructura. El receptor es accesible dentro del método. El ejemplo anterior ilustra este enfoque con un receptor de tipo estructura.
El método con receptor no es de tipo estructura
Go también permite que los métodos tengan receptores que no sean estructuras, siempre que el tipo de receptor y la definición del método estén en el mismo paquete. No se puede definir un método con un tipo de receptor de otro paquete (por ejemplo, int, string).
Por ejemplo:
package main
import "fmt"
// Tạo một kiểu tùy biến dựa trên int
type number int
// Định nghĩa một phương thức với receiver không phải struct
func (n number) square() number {
return n * n
}
func main() {
a := number(4)
b := a.square()
fmt.Println("Square of", a, "is", b)
}
Resultado:
Square of 4 is 16
Método con puntero receptor
En Go, los métodos pueden tener receptores de punteros. Esto permite que los cambios realizados en el método se reflejen en el llamador, lo que no es posible con receptores de valores.
Sintaxis:
func (p *Type) method_name(...Type) Type { // Code}
Por ejemplo:
package main
import "fmt"
// Defining a struct
type person struct {
name string
}
// Phương thức với receiver pointer để chỉnh sửa dữ liệu
func (p *person) changeName(newName string) {
p.name = newName
}
func main() {
a := person{name: "a"}
fmt.Println("Before:", a.name)
// Gọi phương thức này để thay đổi tên
a.changeName("b")
fmt.Println("After:", a.name)
}
Resultado:
Before: a
After: b
El método acepta tanto puntero como valor
A diferencia de las funciones, los métodos Go pueden aceptar receptores tanto de valores como de punteros. Puede pasar punteros o valores y el método los manejará en consecuencia.
Por ejemplo:
package main
import "fmt"
type person struct {
name string
}
// Phương thức với receiver pointer
func (p *person) updateName(newName string) {
p.name = newName
}
// Phương thức với receiver value
func (p person) showName() {
fmt.Println("Name:", p.name)
}
func main() {
a := person{name: "a"}
// Gọi phương thức con trỏ cùng giá trị
a.updateName("b")
fmt.Println("After pointer method:", a.name)
// Gọi phương thức giá trị với con trỏ
(&a).showName()
}
Resultado:
After pointer method: b
Name: b
Diferencia entre método y función
Método |
Mandíbula |
Contiene un receptor |
No contiene receptor |
Es posible definir métodos con el mismo nombre pero diferentes tipos. |
No se permiten funciones con el mismo nombre pero de diferentes tipos. |
No se puede utilizar como superlativo. |
Se pueden utilizar como objetos superordinados. |