Metodele din Golang sunt ca funcții, dar cu o diferență majoră: au un argument receptor , care permite accesul la proprietățile receptorului . Receptorul poate fi de tip struct sau non-struct, dar ambele trebuie să fie în același pachet. Nu este posibil să se creeze metode pentru tipurile definite în alte pachete, inclusiv tipurile încorporate precum int sau string ; În caz contrar, compilatorul va raporta o eroare.

De exemplu:
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()
}
Rezultat:
Name: a
Age: 25
Sintaxă
func(receiver_name Type) method_name(parameter_list) (return_type) {
// Code
}
Receptor: poate fi accesat folosind această metodă.
Metodă cu receptor de tip struct
În Go, puteți defini o metodă în care receptorul este de tip struct. Receptorul este accesibil în cadrul metodei. Exemplul anterior ilustrează această abordare cu un receptor de tip struct.
Metoda cu Receiver nu este de tip struct
Go permite, de asemenea, metodelor să aibă receptori non-struct, atâta timp cât tipul de receptor și definiția metodei sunt în același pachet. Nu puteți defini o metodă cu un tip de receptor dintr-un alt pachet (de exemplu, int, șir).
De exemplu:
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)
}
Rezultat:
Square of 4 is 16
Metoda cu pointer receptor
În Go, metodele pot avea receptori pointer. Acest lucru permite ca modificările făcute în metodă să fie reflectate în apelant, ceea ce nu este posibil cu receptorii de valoare.
Sintaxă:
func (p *Type) method_name(...Type) Type { // Code}
De exemplu:
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)
}
Rezultat:
Before: a
After: b
Metoda acceptă atât pointer, cât și valoare
Spre deosebire de funcții, metodele Go pot accepta atât receptori de valoare, cât și de tip pointer. Puteți trece indicatori sau valori, iar metoda se va descurca în consecință.
De exemplu:
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()
}
Rezultat:
After pointer method: b
Name: b
Diferența dintre metodă și funcție
| Metodă |
Falca |
| Conține un receptor |
Nu contine receptor |
| Este posibil să se definească metode cu același nume, dar tipuri diferite. |
Nu sunt permise funcții cu același nume, dar tipuri diferite. |
| Nu poate fi folosit ca superlativ |
Poate fi folosit ca obiecte superordonate |