Kaedah dalam Golang adalah seperti fungsi tetapi dengan satu perbezaan utama: mereka mempunyai hujah penerima , yang membenarkan akses kepada sifat penerima . Penerima boleh terdiri daripada jenis struct atau bukan struct, tetapi kedua-duanya mestilah dalam pakej yang sama. Tidak mustahil untuk mencipta kaedah untuk jenis yang ditakrifkan dalam pakej lain, termasuk jenis terbina dalam seperti int atau rentetan ; Jika tidak, pengkompil akan melaporkan ralat.

Contohnya:
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()
}
Keputusan:
Name: a
Age: 25
Sintaks
func(receiver_name Type) method_name(parameter_list) (return_type) {
// Code
}
Penerima: Boleh diakses menggunakan kaedah ini.
Kaedah dengan Penerima jenis struct
Dalam Go, anda boleh menentukan kaedah di mana penerima adalah jenis struct. Penerima boleh diakses di dalam kaedah. Contoh sebelumnya menggambarkan pendekatan ini dengan struktur jenis Penerima.
Kaedah dengan Penerima bukan jenis struct
Go juga membenarkan kaedah mempunyai penerima bukan struktur, selagi jenis penerima dan definisi kaedah berada dalam pakej yang sama. Anda tidak boleh menentukan kaedah dengan jenis penerima daripada pakej lain (cth. int, rentetan).
Contohnya:
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)
}
Keputusan:
Square of 4 is 16
Kaedah dengan penunjuk penerima
Dalam Go, kaedah boleh mempunyai penerima penunjuk. Ini membolehkan perubahan yang dibuat dalam kaedah ditunjukkan dalam pemanggil, yang tidak mungkin dilakukan dengan penerima nilai.
Sintaks:
func (p *Type) method_name(...Type) Type { // Code}
Contohnya:
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)
}
Keputusan:
Before: a
After: b
Kaedah menerima kedua-dua penunjuk dan nilai
Tidak seperti fungsi, kaedah Go boleh menerima kedua-dua penerima nilai dan penunjuk. Anda boleh menghantar petunjuk atau nilai dan kaedah akan dikendalikan dengan sewajarnya.
Contohnya:
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()
}
Keputusan:
After pointer method: b
Name: b
Perbezaan antara kaedah dan fungsi
Kaedah |
rahang |
Mengandungi penerima |
Tidak mengandungi penerima |
Adalah mungkin untuk menentukan kaedah dengan nama yang sama tetapi jenis yang berbeza. |
Fungsi dengan nama yang sama tetapi jenis yang berbeza tidak dibenarkan. |
Tidak boleh digunakan sebagai superlatif |
Boleh digunakan sebagai objek superordinat |