انٹرفیس کے لئے پوائنٹرز
تقریباً ہر بار، آپ کو انٹرفیس کی قسم کے لئے پوائنٹرز کی ضرورت نہیں ہوتی۔ آپ کو انٹرفیس کو قیمت کے ذریعے پاس کرنا چاہئے، اور اس طریقے سے، گزر رہے دی گئی اساسی ڈیٹا اب بھی ایک پوائنٹر ہو سکتا ہے۔
انٹرفیس کا عموماً دو شعبے ہوتے ہیں جو اندرونی سطح پر ظاہر ہوتے ہیں:
- کسی مخصوص قسم کی معلومات کے لیے ایک پوائنٹر۔ آپ اسے "قسم" کے طور پر سمجھ سکتے ہیں۔
- ایک ڈیٹا پوائنٹر۔ اگر ذخیرہ شدہ ڈیٹا ایک پوائنٹر ہو تو یہ براہ راست ذخیرہ کیا جاتا ہے۔ اگر ذخیرہ شدہ ڈیٹا ایک قیمت ہو تو اس قیمت کا پوائنٹر ذخیرہ کیا جاتا ہے۔
اگر آپ چاہتے ہیں کہ انٹرفیس کے میثاقیں اندرونی ڈیٹا کو ترتیب دیں، تو آپ کو پوائنٹر رسیورز کا استعمال کرنا ہوگا (آبجیکٹ پوائنٹر کو انٹرفیس متغیر کو تفویض کیا جاتا ہے)۔
type F interface {
f()
}
type S1 struct{}
func (s S1) f() {}
type S2 struct{}
func (s *S2) f() {}
// f1.f() میں ناقابل ہے کہ اندرونی ڈیٹا ترتیب دے
// f2.f() اندرونی ڈیٹا ترتیب کرسکتا ہے، وضاحتی پوائنٹر متغیر f2 کو تفویض کیا جاتا ہے
var f1 F = S1{}
var f2 F = &S2{}
کبھی بھی انٹرفیس کے لئے پوائنٹرز استعمال نہیں کریں، یہ بے معنی ہے۔ Go زبان میں، انٹرفیس خود میں ایک ریفرنس قسم ہے۔ دوسرے الفاظ میں، انٹرفیس کی قسم خود ایک پوائنٹر ہے۔ میری ضرورتوں کے لئے، ٹیسٹنگ کے لئے پیرامیٹر فقط میریانٹرفیس ہونی چاہئے، اور جب میں قیمت کو گزارتا ہوں تو مجھے صرف *میری سٹرکچر کی قسم (اور قیمت کو گزارتے وقت صرف *میری سٹرکچر کی قسم ہی گزار سکتا ہوں) کی ضرورت ہے۔
type myinterface interface{
print()
}
func test(value *myinterface){
//کچھ کرنے کے لئے...
}
type mystruct struct {
i int
}
// انٹرفیس کو پورا کریں
func (this *mystruct) print(){
fmt.Println(this.i)
this.i=1
}
func main(){
m := &mystruct{0}
test(m) // غلط ہے
test(*m) // غلط ہے
}