Les méthodes en Golang sont comme des fonctions mais avec une différence majeure : elles ont un argument récepteur , qui permet d'accéder aux propriétés du récepteur . Le récepteur peut être de type struct ou non-struct, mais les deux doivent être dans le même package. Il n'est pas possible de créer des méthodes pour les types définis dans d'autres packages, y compris les types intégrés comme int ou string ; Sinon, le compilateur signalera une erreur.

Par exemple:
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()
}
Résultat:
Name: a
Age: 25
Syntaxe
func(receiver_name Type) method_name(parameter_list) (return_type) {
// Code
}
Récepteur : accessible via cette méthode.
Méthode avec récepteur de type struct
En Go, vous pouvez définir une méthode où le récepteur est de type struct. Le récepteur est accessible à l'intérieur de la méthode. L'exemple précédent illustre cette approche avec un récepteur de type struct.
La méthode avec le récepteur n'est pas de type structure
Go permet également aux méthodes d'avoir des récepteurs non struct, à condition que le type de récepteur et la définition de la méthode soient dans le même package. Vous ne pouvez pas définir une méthode avec un type de récepteur provenant d'un autre package (par exemple int, string).
Par exemple:
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)
}
Résultat:
Square of 4 is 16
Méthode avec pointeur récepteur
En Go, les méthodes peuvent avoir des récepteurs de pointeurs. Cela permet aux modifications apportées à la méthode d'être répercutées dans l'appelant, ce qui n'est pas possible avec les récepteurs de valeur.
Syntaxe:
func (p *Type) method_name(...Type) Type { // Code}
Par exemple:
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)
}
Résultat:
Before: a
After: b
La méthode accepte à la fois le pointeur et la valeur
Contrairement aux fonctions, les méthodes Go peuvent accepter à la fois des récepteurs de valeur et de pointeur. Vous pouvez passer des pointeurs ou des valeurs et la méthode gérera en conséquence.
Par exemple:
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()
}
Résultat:
After pointer method: b
Name: b
Différence entre méthode et fonction
Méthode |
Mâchoire |
Contient un récepteur |
Ne contient pas de récepteur |
Il est possible de définir des méthodes portant le même nom mais de types différents. |
Les fonctions portant le même nom mais de types différents ne sont pas autorisées. |
Ne peut pas être utilisé comme superlatif |
Peut être utilisé comme objets superordonnés |