1 فنکشن بنیادی
برمجنگ میں، فنکشن ایک کوڈ کا ٹکڑا ہوتا ہے جو ایک مخصوص کام کو پورا کرتا ہے اور اس میں داخل پیرامیٹر اور واپسی قیمتیں ہوتی ہیں۔ Go زبان میں، فنکشنز کوڈ کو منظم اور دوبارہ استعمال کرنے کے لئے وسیع پیمانے پر استعمال ہوتے ہیں۔ فنکشنز کو فعال طریقے سے استعمال کرنے سے کوڈ مختصر، بہتر قابل پڑھائی اور آسان رکھا جا سکتا ہے۔
فنکشنز Go زبان کا ایک بنیادی حصہ ہیں، اور فنکشنز کو کس طرح داخل اور تعریف کیا جاتا ہے، کوڈ کو موثر اور قابل پڑھائی لکھنے کے لئے اہمیت کا حامل ہے۔
2 فنکشن کی تعریف
2.1 فنکشن کا اعلان
Go زبان میں، فنکشن کے عمومی اعلان کی عمومی شکل یہ ہے:
func functionName(parameters) returnType {
// فنکشن باڈی
}
ان اجزاء کو ہم درجہ ذیل کریں گے:
-
func
کی ورد کو استعمال کیا جاتا ہے کہ فنکشن کا اعلان کیا گیا ہے۔ -
functionName
فنکشن کا نام ہے، Go زبان کی نامکمل اصولوں کا پیروی کرتے ہوئے۔ ایک فنکشن جس کا پہلا حرف بڑا ہو، وہ قابل پروز ہوتا ہے، یعنی کہ وہ پیکیج کے باہر ظاہر ہوتا ہے؛ اور جبکہ پہلا حرف چھوٹا ہو، تو وہ قابل پروز نہیں ہوتا اور صرف اسی پیکیج میں استعمال کیا جا سکتا ہے۔ -
parameters
وہ فہرست ہے جس میں فنکشن کو ملنے والے پیرامیٹرز ہیں، جو کہ علیحدہ کموں کے ذریعے الگ کیے گئے ہیں۔ ہر پیرامیٹر کی قسم کو ضرورت ہے کہ specify کیا جائے، اور اگر متعدد پیرامیٹرز ہیں جن کی قسم ایک جیسی ہے، تو قسم صرف ایک دفعہ specify کی جا سکتی ہے۔ -
returnType
فنکشن کی واپسی قیمت کی قسم ہے۔ اگر فنکشن کوئی قیمت واپس نہیں کرتا ہے، تو یہ حصہ نظر انداز کیا جا سکتا ہے۔ اگر فنکشن متعدد قیمتیں واپس کرتا ہے، تو وہ قیمتیں قوسینوں میں ہونی چاہئے۔
مثال کے طور پر، ہم ایک سادہ فنکشن کا اعلان کر سکتے ہیں جو دو عدد صحیح کا مجموعہ کرتا ہے:
func Add(a int, b int) int {
return a + b
}
اس مثال میں، فنکشن کا نام Add
ہے، یہ دو پیرامیٹرز int
قسم کے (a اور b) اسے لیتا ہے، اور یہ ان کا مجموعہ int
قسم کی واپسی قیمت دیتا ہے۔
2.2 پیرامیٹر لسٹ
پیرامیٹر لسٹ وہ فہرست ہے جس میں فنکشن کون کون سے پیرامیٹرز کو قبول کرتا ہے، اور ہر پیرامیٹر کی قسم کیا ہے۔ پیرامیٹرز ایک خاص قسم کے متغیرات ہوتے ہیں جو کہ فنکشن کو ڈیٹا فراہم کرنے کے لئے استعمال ہوتے ہیں۔
func Greet(name string, age int) {
fmt.Printf("Hello, %s! You are %d years old.\n", name, age)
}
اس Greet
فنکشن میں، name
اور age
پیرامیٹرز ہیں۔ name
کی قسم string
ہے، اور age
کی قسم int
ہے۔ اس فنکشن کو کال کرتے وقت، اصل قیمتیں ان پیرامیٹرز کے لئے فراہم کرنی ہوں گی۔
2.3 واپسی قسمیں
فنکشنز محسوب کردہ نتائج واپس کرسکتے ہیں، اور واپسی قسم نتائج کی ڈیٹا قسم کی تعینی کرتی ہے۔ فنکشنز کوئی واپسی قیمت نہیں رکھ سکتے، یا وہ ایک یا چند واپسی قیمتیں رکھ سکتے ہیں۔
اگر فنکشن کی متعدد واپسی قیمتیں ہوں، تو ان کی قسمیں اعلان کرتے وقت انہیں قوسینوں میں موزوں کرنا چاہئے:
func Divide(dividend, divisor float64) (float64, error) {
if divisor == 0 {
return 0, errors.New("cannot divide by zero")
}
return dividend / divisor, nil
}
یہاں Divide
فنکشن دو قیمتیں واپس کرتا ہے: حاصل صرف اور ایک میسج خطا۔ اگر divisor صفر ہو تو، ایک خطا واپس کیا جاتا ہے۔
2.4 Variable Parameters
Go زبان میں، جب ہم کسی فنکشن کی تعریف کے دوران کالر کتنے پیرامیٹرز فراہم کریں گے، اس کا یقین نہیں ہوتا ہے، تو ہم متغیر پیرامیٹرز استعمال کر سکتے ہیں۔ متغیر پیرامیٹرز کی نشاندہی ایک سجیوا کینڈا ‘…’ سے ہوتی ہے، یعنی یہ فنکشن ہر قسم کے پیرامیٹرز قبول کرسکتا ہے۔ یہ بہت کام آتا ہے جب ہم کسی غیر یقینی مقدار کے ڈیٹا سے نشست حاصل کرنا ہو یا کسی خاص قسم کے فنکشنز مثلاً فارمیٹنگ، خلاصہ یا چرچے کی صلاحیت کو implement کرنا ہو۔
اہم استعمال کے مناظر
متغیر پیرامیٹرز کو درج زیل مناظر میں عام طور پر استعمال کیا جاتا ہے:
-
متغیر سٹرنگs سے ملاپ: مثل
fmt.Sprintf
اورstrings.Join
کے فنکشنز۔ - ایرے/سلائس کی پروسیسنگ: جب آرۓ یا سلائس کے مختلف لمبائیوں کے ساتھ کام کیا جائے، مثلاً مجموعہ یا متعدد سلائس کا ملاپ کیا جائے۔
-
لاگنگ اور خرابی کا نجات دادن: جب متعدد خرابیوں کا نجات دادن یا متعدد لاگ کی معلومات ریکارڈ کرنا ہو، جیسے
log.Printf
یا خودکار خرابی کا خلاصہ بنانے کے فنکشنز۔ - مددگار فنکشن: جو API یا لائبریریاں میں استعمال ہوتے ہیں تاکہ صارفوں کو فنکشنز کو کال کرنے کا مخصوص طریقہ فراہم کیا جاسکے۔
متغیر پیرامیٹر استعمال کرنا
یہاں ایک مثال ہے متغیر پیرامیٹر کا استعمال:
// ایک فنکشن تعین کریں جو متغیر عددی پیرامیٹرات لے اور ان کا مجموعہ واپس کرے
func جمع(nums ...int) int {
کل := 0
for _, num := range nums {
کل += num
}
return کل
}
func main() {
// آپ کسی بھی تعداد کے پیرامیٹرات پاس کر سکتے ہیں
fmt.Println(جمع(1, 2)) // Output: 3
fmt.Println(جمع(1, 2, 3, 4)) // Output: 10
// آپ ایک سلائس بھی پاس کر سکتے ہیں اور سلائس کے بعد سے ہمیشہ کے بیج ریاستی دینے والے سنہرے کلمے استعمال کر سکتے ہیں
numbers := []int{1, 2, 3, 4, 5}
fmt.Println(جمع(numbers...)) // Output: 15
}
جمع
فنکشن میں nums
ایک عددی سلائس ہے جو جمع
فنکشن کو پاس کئے گئے تمام پیرامیٹرز کو ہے۔ ہم اس سلائس کو رینج لوپ کا استعمال کر کے چلائیں گے اور مجموعہ حاصل کریں گے۔
یہ بات دھیان میں رکھنی والی ہے کہ فنکشن کے اندر متغیر پیرامیٹرز حقیقت میں ایک سلائس ہیں، لہذا ہم سوار فیصلے کے روابط سے متعلق سلائس کے تمام عمل استعمال کر سکتے ہیں۔ جب آپ کو کسی فنکشن کو متغیر پیرامیٹر کے طور پر ایک سلائس کو پاس کرنا ہو، صرف سلائس کے بعد ایک ایلیپسس ...
شامل کریں۔
متغیر پیرامیٹرز کا استعمال فنکشن کالز کو زیادہ موزون اور مختصر بنا سکتا ہے، لیکن یہ عمل کی کمی میں بھی ایک چھوٹا سا اثر رہتا ہے، کیونکہ متغیر پیرامیٹرز کا استعمال سلائس کی تخلیق اور یادگاری کار میں شامل ہوتا ہے۔ اس لئے، جب ضرورت ہو تو کسی سختی سے پوری کرنی والی کارکردگی کے مطالعے کرانے کی مقررات پر عمل کیا جانا چاہئے۔
مشورہ: سیلائسوں کے بارے میں تفصیلی وضاحت بڑھ میں بھی دی جائے گی۔ اگر آپ کے پاس دیگر پروگرامنگ زبانوں کا تجربہ ہے تو آپ انہیں موقت طور پر ایراکت کی طرح سمجھ سکتے ہیں۔
3 فنکشنز بلا رنگ
3.1 بنیادی فنکشن کالز
فنکشن کو کال کرنا فنکشن کا کوڈ اجراء کرنا ہوتا ہے۔ گو میں، کسی مخصوص فنکشن کو کال کرنا بہت ہی سیدھا ہوتا ہے، صرف فنکشن کا نام استعمال کریں اور مناسب پیرامیٹرز کو پاس کریں۔ مثال کے طور پر:
result := add(3, 4)
fmt.Println(result) // Output: 7
اس مثال میں add
فنکشن کو کال کیا گیا ہے اور دو عدد متعین کر کے نتیجہ عدد کو result
متغیر میں مختص کیا گیا ہے۔
3.2 پیرامیٹرز کو پاس کرنا
جب فنکشن کو پیرامیٹرز کو پاس کرتے ہیں، گو پاس بائی-ویلو استعمال کرنے کا فرض کرتا ہے، جس کا مطلب ہے پیرامیٹر قیمت کا ایک نقل کا نسخہ پاس کرنا، اور اصل ڈیٹا کو تبدیل نہیں کیا جائے گا۔ ہاں اگر آپ چاہتے ہیں کہ فنکشن بیرونی متغیرات کو ترتیب دے یا کارکردگی کے لئے، آپ پوائینٹر یا بڑے سے بڑا سٹرکٹ استعمال کر سکتے ہیں۔
یہاں پیرامیٹرز کو بی-ویلو اور بائی-ریفرنس کی مثالیں ہیں:
// بی-ویلو کی مثال
func ضرب(val int) {
val *= 2
}
// بائی-ریفرنس کی مثال
func doublePtr(val *int) {
*val *= 2
}
func main() {
value := 3
ضرب(value)
fmt.Println(value) // Outputs 3, value remains unchanged
doublePtr(&value)
fmt.Println(value) // Outputs 6, value doubled
}
اوپر دی گئی مثال میں، ویلو
فنکشن کو چاہتی ہے کہ منتقل کرے گئے val
کو دگنا کرے، لیکن وہ صرف اس کا نقل کرتا ہے، اصل value
متغیر کو برقرار رکھتے ہوئے۔ حالانکہ بڑے سے بڑا
فنکشن اصل متغیر کی قیمت کو تبدیل کر دیتا ہے جب وہ بے کوئی انٹیجر متغیر کی پوائنٹر کے طور پر پیرامیٹر کے طور پر وصول کرتا ہے۔