رسیور اور انٹرفیس

مقدار کے رسیور کے ساتھ میتھڈز کو قیمتوں اور پوائنٹرز دونوں کے ذریعے کال کیا جا سکتا ہے۔

پوائنٹر رسیور کے ساتھ میتھڈز صرف پوائنٹرز یا پتہ لگانے والی قیمتیں کے ذریعے کال کیا جا سکتا ہے۔

مثال کے طور پر،

type S struct {
  data string
}

func (s S) Read() string {
  return s.data
}

func (s *S) Write(str string) {
  s.data = str
}

sVals := map[int]S{1: {"A"}}

// آپ صرف ایک قیمت کا استعمال کرتے ہوئے پڑھ سکتے ہیں
sVals[1].Read()

// یہ کمپائل نہیں ہوگا:
// sVals[1].Write("test")

sPtrs := map[int]*S{1: {"A"}}

// پوائنٹر کا استعمال کرتے ہوئے پڑھنے اور لکھنے کے میتھڈز دونوں کو کال کیا جا سکتا ہے
sPtrs[1].Read()
sPtrs[1].Write("test")

اسی طرح، اگرچہ ایک میتھڈ کے پاس ایک قیمت رسیور ہو، وہ ایک انٹرفیس کو ایک پوائنٹر رسیور کے ذریعے بھی مطمئن کر سکتا ہے۔

type F interface {
  f()
}

type S1 struct{}

func (s S1) f() {}

type S2 struct{}

func (s *S2) f() {}

s1Val := S1{}
s1Ptr := &S1{}
s2Val := S2{}
s2Ptr := &S2{}

var i F
i = s1Val
i = s1Ptr
i = s2Ptr

// نیچے دی گئی کوڈ کمپائل نہیں ہوگا کیونکہ s2Val ایک قیمت ہے اور S2 کا f میتھڈ ایک قیمت رسیور نہیں ہے
// i = s2Val

موثر گو میں پوائنٹرز بمقابلہ قیمتیں کے بارے میں عمدہ وضاحتیں شامل ہیں۔

اضافی نوٹس:

  • ایک قسم کے پاس میتھڈ سیٹ ہو سکتی ہے جو قیمت رسیورز کے ساتھ ہوں اور ایک پوائنٹر رسیورز کے ساتھ ہوں
    • میتھڈ سیٹ جس کے پاس قیمت رسیور ہو وہ پوائنٹر رسیور کے ساتھ کم ہوتی ہے، مگر اس کا بالعکس نہیں ہوتا
  • قواعد
    • قیمت کے آبجیکٹ صرف وہ میتھڈ سیٹ استعمال کر سکتے ہیں جس میں قیمت رسیور ہو
    • پوائنٹر آبجیکٹ وہ میتھڈ سیٹ استعمال کر سکتے ہیں جس میں قیمت رسیور + پوائنٹر رسیور ہو
  • انٹرفیس میچنگ (یا ایمپلیمنٹیشن)
    • قسم اگر انٹرفیس کے تمام میتھڈز کا ایمپلیمنٹ کرتی ہے تو وہ انٹرفیس سے میچ کرتی ہے
    • خصوصاً، یہ یا تو قسم کی قیمت میتھڈ سیٹ کا انٹرفیس سے میچ ہوتا ہے یا پوائنٹر میتھڈ سیٹ انٹرفیس سے میچ ہوتا ہے

دو مخصوص قسم کی میچنگ ہے:

  • قیمت میتھڈ سیٹ انٹرفیس سے میچ ہوتا ہے
    • ایک قیمت یا پوائنٹر آبجیکٹ کو انٹرفیس متغیر میں اس لئے کوئی بات نہیں کیونکہ دونوں میں میتھڈ سیٹ شامل ہوتی ہے
  • پوائنٹر میتھڈ سیٹ انٹرفیس سے میچ ہوتا ہے
    • صرف پوائنٹر آبجیکٹ کو انٹرفیس متغیر میں اس لئے کوئی بات نہیں کیونکہ صرف پوائنٹر میتھڈ سیٹ انٹرفیس سے میچ ہوتی ہے
    • اگر ایک قیمت آبجیکٹ کو انٹرفیس متغیر میں میچ کیا جاتا ہے، تو کمپائل کے دوران انٹرفیس کی زندگی کی جانچ کی میکانیزم کو ٹرگر کرے گا

سوال ہوتا ہے کہ i = s2Val کیوں خطا کو ٹریگر کرتا ہے، یہ اس وجہ سے کیونکہ قیمت میتھڈ سیٹ اور انٹرفیس میچ نہیں ہوتے۔