Methoden in Golang lijken op functies, maar met één groot verschil: ze hebben een receiver -argument , waarmee toegang verkregen kan worden tot de eigenschappen van de receiver . De ontvanger kan van het type struct of non-struct zijn, maar beide moeten zich in hetzelfde pakket bevinden. Het is niet mogelijk om methoden te maken voor typen die in andere pakketten zijn gedefinieerd, inclusief ingebouwde typen zoals int of string ; Anders zal de compiler een fout rapporteren.

Bijvoorbeeld:
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()
}
Resultaat:
Name: a
Age: 25
Syntaxis
func(receiver_name Type) method_name(parameter_list) (return_type) {
// Code
}
Ontvanger: Kan via deze methode worden benaderd.
Methode met ontvanger van struct-type
In Go kunt u een methode definiëren waarbij de ontvanger van het type struct is. Ontvanger is toegankelijk binnen de methode. Het vorige voorbeeld illustreert deze aanpak met een Receiver van het type struct.
Methode met ontvanger is geen structuurtype
Go staat ook toe dat methoden niet-structuurontvangers hebben, zolang het ontvangertype en de methodedefinitie zich in hetzelfde pakket bevinden. U kunt geen methode definiëren met een ontvangertype uit een ander pakket (bijv. int, string).
Bijvoorbeeld:
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)
}
Resultaat:
Square of 4 is 16
Methode met ontvangerwijzer
In Go kunnen methoden pointer-ontvangers hebben. Hierdoor kunnen wijzigingen die in de methode zijn aangebracht, worden weerspiegeld in de aanroeper. Dit is niet mogelijk bij waardeontvangers.
Syntaxis:
func (p *Type) method_name(...Type) Type { // Code}
Bijvoorbeeld:
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)
}
Resultaat:
Before: a
After: b
Methode accepteert zowel pointer als waarde
In tegenstelling tot functies kunnen Go-methoden zowel waarde- als pointerontvangers accepteren. U kunt pointers of waarden doorgeven en de methode zal hiernaar handelen.
Bijvoorbeeld:
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()
}
Resultaat:
After pointer method: b
Name: b
Verschil tussen methode en functie
| Methode |
Kaak |
| Bevat een ontvanger |
Bevat geen ontvanger |
| Het is mogelijk om methoden met dezelfde naam maar verschillende typen te definiëren. |
Functies met dezelfde naam maar verschillende typen zijn niet toegestaan. |
| Kan niet als superlatief worden gebruikt |
Kan gebruikt worden als bovengeschikte objecten |