الطرائق على البُنى
مقارنة مستقبلات القيم بمستقبلات المؤشرات
الطرائق على البُنى درس مجاني في Go Academy على CoddyKit. هذا هو الدرس 2 من أصل 4. يمكنك قراءة الدرس كاملاً أدناه مجاناً — ثم تمرن عليه مباشرة في المتصفح باستخدام محرر أكواد مدمج ومدرس ذكاء اصطناعي متاح 24/7. هذا الدرس جزء من مسار التعلم في Go Academy، وتقدمك يتزامن عبر الويب وتطبيق CoddyKit. تتضمن دورة Go Academy 4 دروس في المجموع.
ما هي الطريقة؟
الطريقة هي دالة لها وسيط مستقبِل. يظهر المستقبِل بين الكلمة المفتاحية func واسم الطريقة، وبذلك يربط الدالة بنوع معيّن.
مستقبِل بقيمة
يتلقى المستقبِل بقيمة نسخة من البنية. استخدمه عندما لا تحتاج الطريقة إلى تعديل الحالة:
package main
import "fmt"
type Circle struct{ Radius float64 }
func (c Circle) Area() float64 {
return 3.14159 * c.Radius * c.Radius
}
func main() {
c := Circle{Radius: 5}
fmt.Printf("%.2f\n", c.Area()) // 78.54
}مستقبِل بمؤشر
يتيح المستقبِل بمؤشر للطريقة تعديل البنية. وهو أكثر كفاءة مع البنى الكبيرة:
package main
import "fmt"
type Counter struct{ N int }
func (c *Counter) Increment() { c.N++ }
func (c *Counter) Reset() { c.N = 0 }
func main() {
c := Counter{}
c.Increment(); c.Increment()
fmt.Println(c.N) // 2
c.Reset()
fmt.Println(c.N) // 0
}متى تستخدم المستقبِلات بمؤشر
استخدم المستقبِلات بمؤشر عندما:
- تحتاج الطريقة إلى تعديل المستقبِل
- تكون البنية كبيرة (لتجنب النسخ)
- تحتاج إلى الاتساق: إذا كانت لأي طريقة مستقبِل بمؤشر، فينبغي أن تكون جميع الطرق كذلك
استخدم المستقبِلات بقيمة عندما تكون البنية صغيرة ولا تقرأ الطريقة إلا البيانات.
تعبيرات الطرق وقيمها
يمكن استخدام الطرق كقيم من الدرجة الأولى:
package main
import "fmt"
type Adder struct{ Base int }
func (a Adder) Add(n int) int { return a.Base + n }
func main() {
a := Adder{Base: 10}
fn := a.Add // method value — bound to a
fmt.Println(fn(5)) // 15
}طرق على أنواع غير البنى
يمكنك تعريف طرق على أي نوع مُسمّى ضمن الحزمة نفسها، وليس على البنى فقط:
package main
import "fmt"
type Celsius float64
func (c Celsius) ToFahrenheit() float64 {
return float64(c)*9/5 + 32
}
func main() {
t := Celsius(100)
fmt.Println(t.ToFahrenheit()) // 212
}إلغاء الإشارة التلقائي للمؤشر
يتولى Go تلقائيًا أخذ العنوان أو إلغاء الإشارة عند استدعاء الطرق. ولا تحتاج إلى كتابة (&c).Method() يدويًا:
package main
import "fmt"
type Box struct{ Val int }
func (b *Box) Double() { b.Val *= 2 }
func main() {
b := Box{Val: 5}
b.Double() // Go auto-takes address
fmt.Println(b.Val) // 10
}تسلسل استدعاءات الطرق
أعد مؤشر المستقبِل لتمكين تسلسل استدعاءات الطرق (نمط المُنشئ):
package main
import "fmt"
type Builder struct{ result string }
func (b *Builder) Add(s string) *Builder {
b.result += s
return b
}
func (b *Builder) Build() string { return b.result }
func main() {
s := (&Builder{}).Add("Hello").Add(", ").Add("World").Build()
fmt.Println(s)
}طريقة String (fmt.Stringer)
نفّذ الطريقة String() string للتحكم في كيفية طباعة النوع:
package main
import "fmt"
type Point struct{ X, Y int }
func (p Point) String() string {
return fmt.Sprintf("(%d, %d)", p.X, p.Y)
}
func main() {
p := Point{3, 4}
fmt.Println(p) // (3, 4)
}مستقبِلات المؤشر nil
يمكن استدعاء طريقة لها مستقبِل بمؤشر على مؤشر قيمته nil — وهذا مفيد للسلوكيات الافتراضية:
package main
import "fmt"
type Node struct{ Val int }
func (n *Node) Value() int {
if n == nil { return 0 }
return n.Val
}
func main() {
var n *Node
fmt.Println(n.Value()) // 0
}مبدأ الاتساق
في مكتبة Go القياسية وفي أسلوب Go الاصطلاحي، تستخدم جميع الطرق على النوع نفسه النوع ذاته من المستقبِل — فإما أن تكون جميعها بمؤشر أو جميعها بقيمة. وقد يؤدي المزج بينهما إلى أخطاء دقيقة مع الواجهات.
تحقق سريع
أي نوع من المستقبِلات يسمح للطريقة بتعديل حقول البنية؟
مراجعة: الطرق
أهم النقاط:
- تحتوي الطرق على مستقبِل بين
funcوالاسم - المستقبِلات بقيمة: للقراءة فقط والبنى الصغيرة
- المستقبِلات بمؤشر: للتعديل والبنى الكبيرة والاتساق
- يلغي Go الإشارة تلقائيًا — ولا حاجة إلى كتابة
(&v).Method() - نفّذ
String() stringللطباعة المخصصة
مهمة تدريبية
عرّف بنية BankAccount بحقل Balance float64. أضف طريقتَي المستقبِل بمؤشر Deposit وWithdraw، وطريقة المستقبِل بقيمة String().
الأسئلة الشائعة
هل درس «الطرائق على البُنى» مجاني؟
نعم — نص درس «الطرائق على البُنى» كامل متاح مجاناً هنا على الويب. لتمرينه بشكل تفاعلي (محرر أكواد مدمج ومدرس ذكاء اصطناعي متاح 24/7) وفتح باقي دورة Go Academy، انتقل إلى CoddyKit PRO. تتضمن دورة Go Academy 4 دروس في المجموع.
ماذا ستتعلم في «الطرائق على البُنى»؟
مقارنة مستقبلات القيم بمستقبلات المؤشرات تتمرن على Go Academy مع أكواد عملية تشغلها مباشرة في المتصفح، ومدرس ذكاء اصطناعي متاح 24/7 يجيب على أسئلتك أثناء عملك.
هل أحتاج إلى خبرة سابقة لأبدأ Go Academy؟
لا تُشترط خبرة سابقة. Go Academy على CoddyKit منظم للمبتدئين حتى المتقدمين، لذا يمكنك البدء من هنا أو من البداية والتقدم بسرعتك الخاصة. هذا هو الدرس 2 من أصل 4.
كم من الوقت يستغرق درس «الطرائق على البُنى»؟
معظم دروس CoddyKit تستغرق حوالي 5–10 دقائق. كل منها موجز وتفاعلي، لذا تحرز تقدماً مستمراً وتستأنف من حيث توقفت عبر الويب والتطبيق.
هل يمكنني كتابة وتشغيل أكواد في درس Go Academy هذا؟
نعم. كل درس في Go Academy يتضمن محرر أكواد مدمج، لذا تكتب وتشغل أكواداً حقيقية مباشرة في متصفحك وتحصل على تعليقات فورية من الذكاء الاصطناعي — بدون إعداد محلي.
جميع الدروس في هذه الدورة
- تعريف البُنى واستخدامها
- الطرائق على البُنى
- أنماط المُنشئات
- البُنى المجهولة والتركيب