I metodi in Golang sono come le funzioni, ma con una differenza sostanziale: hanno un argomento receiver , che consente l'accesso alle proprietà del receiver . Il ricevitore può essere di tipo struct o non-struct, ma entrambi devono trovarsi nello stesso pacchetto. Non è possibile creare metodi per i tipi definiti in altri pacchetti, inclusi i tipi incorporati come int o string ; In caso contrario, il compilatore segnalerà un errore.

Per esempio:
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()
}
Risultato:
Name: a
Age: 25
Sintassi
func(receiver_name Type) method_name(parameter_list) (return_type) {
// Code
}
Ricevitore: è possibile accedervi utilizzando questo metodo.
Metodo con ricevitore di tipo struct
In Go è possibile definire un metodo in cui il ricevitore è di tipo struct. Il ricevitore è accessibile all'interno del metodo. L'esempio precedente illustra questo approccio con un Receiver di tipo struct.
Il metodo con Receiver non è di tipo struct
Go consente anche ai metodi di avere ricevitori non-struct, a condizione che il tipo di ricevitore e la definizione del metodo siano nello stesso pacchetto. Non è possibile definire un metodo con un tipo di ricevitore di un altro pacchetto (ad esempio int, string).
Per esempio:
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)
}
Risultato:
Square of 4 is 16
Metodo con puntatore del ricevitore
In Go, i metodi possono avere ricevitori di puntatori. Ciò consente che le modifiche apportate al metodo vengano riflesse nel chiamante, cosa che non è possibile con i ricevitori di valori.
Sintassi:
func (p *Type) method_name(...Type) Type { // Code}
Per esempio:
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)
}
Risultato:
Before: a
After: b
Il metodo accetta sia il puntatore che il valore
A differenza delle funzioni, i metodi Go possono accettare sia ricevitori di valori che di puntatori. È possibile passare puntatori o valori e il metodo li gestirà di conseguenza.
Per esempio:
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()
}
Risultato:
After pointer method: b
Name: b
Differenza tra metodo e funzione
Metodo |
Mascella |
Contiene un ricevitore |
Non contiene il ricevitore |
È possibile definire metodi con lo stesso nome ma tipi diversi. |
Non sono consentite funzioni con lo stesso nome ma tipi diversi. |
Non può essere usato come superlativo |
Possono essere usati come oggetti superordinati |