Golang'daki metotlar fonksiyonlara benzer ancak aralarında önemli bir fark vardır: alıcının özelliklerine erişim sağlayan bir alıcı argümanları vardır . Alıcı struct veya non-struct tipinde olabilir, ancak her ikisi de aynı pakette olmalıdır. int veya string gibi yerleşik tipler de dahil olmak üzere, diğer paketlerde tanımlanan tipler için metot oluşturmak mümkün değildir ; Aksi takdirde derleyici hata verecektir.

Örneğin:
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()
}
Sonuç:
Name: a
Age: 25
Sözdizimi
func(receiver_name Type) method_name(parameter_list) (return_type) {
// Code
}
Alıcı: Bu yöntem kullanılarak erişilebilir.
Yapı türünde Alıcıya sahip yöntem
Go'da alıcının struct tipinde olduğu bir metot tanımlayabilirsiniz. Alıcıya metodun içinden ulaşılabilir. Önceki örnek bu yaklaşımı struct tipinde bir Receiver ile göstermektedir.
Alıcıya sahip yöntem yapı türünde değil
Go ayrıca alıcı türü ve metot tanımı aynı pakette olduğu sürece metotların yapı dışı alıcılara sahip olmasına da izin verir. Başka bir paketteki alıcı türüyle (örneğin int, string) bir metot tanımlayamazsınız.
Örneğin:
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)
}
Sonuç:
Square of 4 is 16
Alıcı işaretçili yöntem
Go'da metotlar işaretçi alıcılarına sahip olabilir. Bu, yöntemde yapılan değişikliklerin çağırana yansıtılmasını sağlar; bu, değer alıcılarında mümkün değildir.
Sözdizimi:
func (p *Type) method_name(...Type) Type { // Code}
Örneğin:
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)
}
Sonuç:
Before: a
After: b
Yöntem hem işaretçiyi hem de değeri kabul eder
Fonksiyonların aksine, Go metotları hem değer hem de işaretçi alıcılarını kabul edebilir. İşaretçiler veya değerler geçirebilirsiniz ve metot buna göre işlem yapacaktır.
Örneğin:
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()
}
Sonuç:
After pointer method: b
Name: b
Yöntem ve fonksiyon arasındaki fark
Yöntem |
Çene |
Bir alıcı içerir |
Alıcı içermiyor |
Aynı isimde fakat farklı tipte metotlar tanımlamak mümkündür. |
Aynı isimli ancak farklı tipteki fonksiyonlara izin verilmez. |
En üstünlük derecesi olarak kullanılamaz |
Üst nesneler olarak kullanılabilir |