Metody w języku Go są podobne do funkcji, z jedną zasadniczą różnicą: mają argument odbiorcy , który umożliwia dostęp do właściwości odbiorcy . Odbiornik może być typu struct lub non-struct, ale oba muszą znajdować się w tym samym pakiecie. Nie można tworzyć metod dla typów zdefiniowanych w innych pakietach, w tym dla typów wbudowanych, takich jak int lub string ; W przeciwnym wypadku kompilator zgłosi błąd.

Na przykład:
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()
}
Wynik:
Name: a
Age: 25
Składnia
func(receiver_name Type) method_name(parameter_list) (return_type) {
// Code
}
Odbiornik: Można uzyskać do niego dostęp za pomocą tej metody.
Metoda z odbiornikiem typu struktury
W języku Go można zdefiniować metodę, w której odbiorca jest typu struct. Odbiornik jest dostępny wewnątrz metody. Poprzedni przykład ilustruje to podejście na przykładzie odbiornika typu struct.
Metoda z odbiornikiem nie jest typem struktury
Język Go pozwala również na posiadanie przez metody odbiorników niebędących strukturami, pod warunkiem, że typ odbiornika i definicja metody znajdują się w tym samym pakiecie. Nie można zdefiniować metody z typem odbiornika z innego pakietu (np. int, string).
Na przykład:
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)
}
Wynik:
Square of 4 is 16
Metoda ze wskaźnikiem odbiornika
W języku Go metody mogą mieć odbiorniki wskaźników. Dzięki temu zmiany wprowadzone w metodzie mogą być odzwierciedlone w programie wywołującym, co nie jest możliwe w przypadku odbiorników wartości.
Składnia:
func (p *Type) method_name(...Type) Type { // Code}
Na przykład:
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)
}
Wynik:
Before: a
After: b
Metoda akceptuje zarówno wskaźnik, jak i wartość
W przeciwieństwie do funkcji, metody języka Go mogą akceptować zarówno odbiorniki wartości, jak i wskaźniki. Możesz przekazać wskaźniki lub wartości, a metoda obsłuży je odpowiednio.
Na przykład:
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()
}
Wynik:
After pointer method: b
Name: b
Różnica między metodą a funkcją
Metoda |
Szczęka |
Zawiera odbiornik |
Nie zawiera odbiornika |
Można zdefiniować metody o tej samej nazwie, ale różnych typach. |
Nie są dozwolone funkcje o tej samej nazwie, ale różnych typach. |
Nie można używać jako stopnia najwyższego |
Można używać jako obiektów nadrzędnych |