الأساليب في Golang تشبه الوظائف ولكن مع اختلاف رئيسي واحد: لديها وسيطة مستقبل ، والتي تسمح بالوصول إلى خصائص المستقبل . يمكن أن يكون المستقبل من نوع struct أو غير struct، ولكن يجب أن يكون كلاهما في نفس الحزمة. ليس من الممكن إنشاء طرق للأنواع المحددة في حزم أخرى، بما في ذلك الأنواع المضمنة مثل int أو string ؛ وإلا، فسوف يقوم المترجم بالإبلاغ عن خطأ.

على سبيل المثال:
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()
}
نتيجة:
Name: a
Age: 25
بناء الجملة
func(receiver_name Type) method_name(parameter_list) (return_type) {
// Code
}
المستقبل: يمكن الوصول إليه باستخدام هذه الطريقة.
طريقة مع مستقبل من نوع الهيكل
في Go، يمكنك تعريف طريقة حيث يكون المستقبل من نوع struct. يمكن الوصول إلى جهاز الاستقبال داخل الطريقة. يوضح المثال السابق هذا النهج باستخدام Receiver من نوع struct.
الطريقة مع المستقبل ليست من نوع الهيكل
تسمح Go أيضًا للطرق بأن يكون لها مستقبلات غير هيكلية، طالما أن نوع المستقبل وتعريف الطريقة موجودان في نفس الحزمة. لا يمكنك تعريف طريقة بنوع مستقبل من حزمة أخرى (على سبيل المثال int، string).
على سبيل المثال:
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)
}
نتيجة:
Square of 4 is 16
الطريقة مع مؤشر المستقبل
في Go، يمكن أن تحتوي الأساليب على مستقبلات مؤشر. يتيح هذا للتغييرات التي تم إجراؤها في الطريقة أن تنعكس في المتصل، وهو أمر غير ممكن مع مستقبلات القيمة.
بناء الجملة:
func (p *Type) method_name(...Type) Type { // Code}
على سبيل المثال:
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)
}
نتيجة:
Before: a
After: b
تقبل الطريقة كل من المؤشر والقيمة
على عكس الوظائف، يمكن لطرق Go قبول كل من مستقبلات القيمة والمؤشر. يمكنك تمرير المؤشرات أو القيم وسوف تقوم الطريقة بالتعامل معها وفقًا لذلك.
على سبيل المثال:
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()
}
نتيجة:
After pointer method: b
Name: b
الفرق بين الطريقة والوظيفة
| طريقة |
فك |
| يحتوي على جهاز استقبال |
لا يحتوي على جهاز استقبال |
| من الممكن تعريف طرق بنفس الاسم ولكن بأنواع مختلفة. |
لا يُسمح بالوظائف التي تحمل نفس الاسم ولكن أنواعًا مختلفة. |
| لا يمكن استخدامها كصيغة تفضيل |
يمكن استخدامها ككائنات علوية |