ماڈیول اسباق (2/5)
صفر قدر اور قسم کے تبادلے۔
Go میں واضح قدر کے بغیر اعلان کردہ ہر متغیر کو a موصول ہوتا ہے۔
صفر قدر: اپنی قسم کی "غیر جانبدار قدر"۔ یہ بہت بڑا فرق ہے۔
JavaScript سے، جہاں let x; پیدا کرتا ہے undefined، یا C، جہاں آپ ختم کرتے ہیں
کوڑے دان کی یادداشت کے ساتھ۔ نہیں undefined، کوئی UB نہیں: صرف صفر۔
صفر ویلیو ٹیبل
| زمرہ | قسم | صفر قدر |
|---|---|---|
| عددی | int, int64, float32, float64, uint, ... | 0 |
| بولین | bool | false |
| سٹرنگ | string | "" (خالی سٹرنگ) |
| پوائنٹر | *T | nil |
| سلائس / نقشہ / چینل | []T, map[K]V, chan T | nil |
| فنکشن / انٹرفیس | func(...), interface{...} | nil |
| ساخت | T struct{...} | تمام فیلڈز ان کی صفر ویلیو پر |
var i int // 0
var f float64 // 0
var s string // ""
var b bool // false
var p *int // nil
var nums []int // nil (NB: una slice nil ha len 0 e si può iterare!)تبدیلیاں ہمیشہ واضح ہوتی ہیں۔
C، Python یا JS کے برعکس، Go **خودکار طور پر ایک کو فروغ نہیں دیتا ہے۔
دوسرے کے لیے عددی قسم: آپ کو type(value) لکھنا چاہیے۔
i := 42
var f float64 = float64(i)
var u uint = uint(i)یہ "مطابقت پذیر" اقسام جیسے int اور int64 کے لئے بھی درست ہے: ایک
واضح تبدیلی کی ہمیشہ ضرورت ہوتی ہے۔
var a int = 10
var b int64 = int64(a) // obbligatorioہندسوں کے درمیان تبدیلی: تراشے جانے پر دھیان دیں۔
float64 سے int تک جانا صفر کی طرف چھوٹا ہوتا ہے، ایسا نہیں ہوتا
گول:
f := 3.9
i := int(f) // 3, non 4
n := int(-3.9) // -3, non -4سٹرنگ ↔ نمبر کی تبدیلی
string(65) نہیں دیتا "65": یہ دیتا ہے "A" (کوڈ کے ساتھ رون
نقطہ 65)۔ سٹرنگ → نمبر اور اس کے برعکس آپ کو strconv کی ضرورت ہے
پیکیج:
import "strconv"
s := strconv.Itoa(42) // "42"
n, err := strconv.Atoi("42") // 42, nilہم Stdlib ماڈیول میں اس کا گہرائی میں احاطہ کریں گے۔
آپ کی باری
ٹائپ int کے متغیر کاؤنٹر کو شروع کیے بغیر ڈیکلیئر کریں اور اسے پرنٹ کریں۔ متوقع: 0۔
اشارہ دکھائیں۔
ابتداء کے بغیر متغیر قسم کی صفر قدر لیتا ہے۔
3 کوششوں کے بعد حل دستیاب ہے۔
عدد n=10 کو دیکھتے ہوئے، n کو float64 میں تبدیل کریں اور 4 سے تقسیم کریں۔ نتیجہ پرنٹ کریں (متوقع 2.5)۔
اشارہ دکھائیں۔
واضح تبدیلی کے بغیر، `n/4` ایک عددی تقسیم ہے جو 2 دیتا ہے۔
3 کوششوں کے بعد حل دستیاب ہے۔
یہ کوڈ کیا پرنٹ کرتا ہے؟
f := 3.7
fmt.Println(int(f))Recap
- ہر قسم کی ایک مستقل صفر قدر ہوتی ہے: کوئی
undefined، کوئی UB نہیں۔ - Slice/map/chan/func/interface/pointer کی قدر صفر ہے
nil۔ - عددی تبدیلیاں ہمیشہ
type(value)کے ساتھ واضح ہوتی ہیں۔ int(float)صفر کی طرف چھوٹا ہوتا ہے؛ گول استعمال کرنے کے لیےmath.Round۔- سٹرنگ ↔ نمبر کے لیے
strconvپیکیج استعمال کریں (براہ راست کاسٹ نہیں)۔