1 گولانگ ڈیٹا ٹائپس کی تعارف

گولانگ میں، ڈیٹا ٹائپس پروگرامنگ کا بنیاد ہیں، جو متغیرات کوسٹور کرنے والے ڈیٹا کی شکل تعین کرتے ہیں۔ گولانگ کے دوائیں ڈیٹا ٹائپس درج ذیل قسموں میں تقسیم کیے جاتے ہیں:

ڈیٹا ٹائپ تفصیل میموری استعمال
bool بولین ٹائپ، جو سچ یا جھوٹ کو محفوظ کرنے کے لیے استعمال ہوتا ہے 1 بائٹ
int، uint سائنڈ اور یونسائنڈ معدود عدد، پلیٹفارم کے معیار پر معمولی سائز پر منحصر ہوتا ہے 4 یا 8 بائٹ
int8، uint8 8 بٹ سائنڈ اور یونسائنڈ معدود عدد 1 بائٹ
int16، uint16 16 بٹ سائنڈ اور یونسائنڈ معدود عدد 2 بائٹ
int32، uint32 32 بٹ سائنڈ اور یونسائنڈ معدود عدد 4 بائٹ
int64، uint64 64 بٹ سائنڈ اور یونسائنڈ معدود عدد 8 بائٹ
float32 32 بٹ فلاٹنگ پوائنٹ نمبر 4 بائٹ
float64 64 بٹ فلاٹنگ پوائنٹ نمبر 8 بائٹ
complex64 32 بٹ جوڑی دار عدد جس میں حقیقی اورخیالی حصوں کا استعمال ہوتا ہے 8 بائٹ
complex128 64 بٹ جوڑی دار عدد جس میں حقیقی اورخیالی حصوں کا استعمال ہوتا ہے 16 بائٹ
byte uint8 کے مشابہ 1 بائٹ
rune int32 کے مشابہ، جو یونیکوڈ کوڈ پوائنٹ کا مظاہرہ کرتا ہے 4 بائٹ
string اسٹرنگ ٹائپ سٹرنگ کی لمبائی پر منحصر ہے
error ایرر انٹرفیس، جو خرابی کی معلومات واپس کرنے کے لیے استعمال ہوتا ہے کوئی مقررہ سائز نہیں

یہ ٹائپس مختلف ضروریات کے مطابق منتخب کیے جا سکتے ہیں، مثلاً عددی حساب وغیرہ۔

2 عدد صحیح ڈیٹا ٹائپس

2.1 عدد صحیح ٹائپس کا جائزہ

گولانگ میں متعدد بنیادی عدد صحیح ٹائپس ہیں، جنے مندرجہ ذیل قسموں میں تقسیم کیا گیا ہے:

  • سائنڈ انٹیجرز: int8، int16، int32 (یا runeint64، اور int
  • یونسائنڈ انٹیجرز: uint8 (یا byteuint16، uint32، uint64، اور uint

int اور uint کی سائزیں 32 بٹ سسٹمز پر 4 بائٹ ہوتی ہیں اور 64 بٹ سسٹمز پر 8 بائٹ ہوتی ہیں۔ انٹیجر ڈیٹا ٹائپس کی قیمت کی رینج مندرجہ ذیل جدول میں دکھائی گئی ہے:

قسم قیمت کی رینج
int8 -128 تا 127
uint8 0 تا 255
int16 -32768 تا 32767
uint16 0 تا 65535
int32 -2147483648 تا 2147483647
uint32 0 تا 4294967295
int64 -9223372036854775808 تا 9223372036854775807
uint64 0 تا 18446744073709551615

2.2 عدد صحیح متغیرات کا استعمال

ایک عدد صحیح متغیر کو دعوت کرنے کا بنیادی سنٹیکس مندرجہ ذیل ہے:

var متغیر_نام ڈیٹا_ٹائپ = ابتدائی_قیمت

نمونہ کوڈ:

package main
import "fmt"

func main() {
    var a int = 10 // سائنڈ انٹیجر متغیر
    var b uint = 20 // یونسائنڈ انٹیجر متغیر
    var c int8 = -128 // سب سے چھوٹی int8 قیمت
    fmt.Println(a, b, c)
}

2.3 عدد صحیح عملیات

گولانگ عام حساب وغیرہ کے عام آپریٹرز کو سپورٹ کرتا ہے، جیسے جمع (+)، منفی (-)، ضرب (*)، تقسیم (/)، اور ماڈیو (%)، ساتھ ہی بٹ وائیز آپریٹرز جیسے کہ بٹ وائیز اینڈ (&)، آر (|)، زیکسور (^)، بائیٹ شفٹ بائی 1 (<<)، اور بائیٹ شفٹ رائیٹ 1 (>>) بھی ہیں۔

package main
import "fmt"

func main() {
    x := 10
    y := 3

    // حساب عملیات
    fmt.Println(x + y) // جمع
    fmt.Println(x - y) // منفی
    fmt.Println(x * y) // ضرب
    fmt.Println(x / y) // تقسیم
    fmt.Println(x % y) // ماڈیو

    // بٹ وائیز عملیات
    fmt.Println(x & y)  // بٹ وائیز اینڈ
    fmt.Println(x | y)  // بٹ وائیز آر
    fmt.Println(x ^ y)  // بٹ وائیز زیکسور
    fmt.Println(x << 1) // بائٹ شفٹ بائی 1
    fmt.Println(x >> 1) // بائٹ شفٹ رائیٹ 1
}

3 فلاٹنگ پوائنٹ ڈیٹا ٹائپس

3.1 فلوٹنگ پوائنٹ ڈیٹا ٹائپ کا جائزہ

Go زبان میں، فلوٹنگ پوائنٹ ٹائپز میں float32 اور float64 شامل ہیں، جو 32 بیٹ اور 64 بیٹ فلوٹنگ پوائنٹ ڈیٹا کو ظاہر کرتے ہیں۔ عموماً، float64 کا استعمال کرنا مشورہ دیا جاتا ہے کیونکہ یہ زیادہ رینج اور زیادہ درست پریسیژن فراہم کرتا ہے۔

  • float32 کے قریب تقریباً 23 نمایاں بٹس ہیں، جو تقریباً 7 اعشاری ہندسوں کی درستی فراہم کرتے ہیں۔
  • float64 کے قریب تقریباً 52 نمایاں بٹس ہیں، جو تقریباً 16 اعشاری ہندسوں کی درستی فراہم کرتے ہیں۔

3.2 فلوٹنگ پوائنٹ متغیرات کا استعمال

فلوٹنگ پوائنٹ متغیرات کو بظاہر کسی حرفی نمائندے دینے یا var کلیدی کا استعمال کرکے ظاہر کیا جا سکتا ہے:

package main
import "fmt"

func main() {
    var f1 float32 = 3.14 // فلوٹ32 ٹائپ کی وضاحت کریں
    f2 := 3.14            // خود بخود فلوٹ64 ٹائپ کیا جائے گا
    fmt.Println(f1, f2)
}

3.3 فلوٹنگ پوائنٹ حساب اور مسائل

فلوٹنگ پوائنٹ حساب میں درستی کی ضیاع ہو سکتی ہے۔ بالخصوص دو بہت قریبی اعداد منفی کرنے کے وقت، عموماً اس مسئلے کا سامنا ہوتا ہے۔

package main
import "fmt"

func main() {
    f1 := .1
    f2 := .2
    f3 := f1 + f2
    fmt.Println(f3) // درستی کی مسئلے کی بنا پر، متوقع نتیجہ .3 نہیں ہو سکتا ہے۔

    // فارمیٹ کردہ اوٹپٹ کو استعمال کرکے درستی کی مسائل کو ٹھیک کرنا
    fmt.Printf("%.1f\n", f3) // اوٹپٹ کو .3 تصحیح کیا گیا
}

4 بولین ڈیٹا ٹائپ

4.1 بولین ڈیٹا ٹائپ کا جائزہ

بولین سب سے سادہ ڈیٹا ٹائپ ہے، اور اس کے صرف دو عددی قیمتیں ہوتی ہیں: ٹھیک (سچ) اور جھوٹ (غلط)۔ یہ شرائطی عبارتوں اور لوپ کنٹرول ساختوں میں اہم کردار ادا کرتا ہے۔

4.2 بولین متغیرات کا استعمال

بولین متغیرات کا اعلان اور استعمال:

package main
import "fmt"

func main() {
    var success bool = true
    var fail bool = false
    fmt.Println("عمل کامیاب ہوا:", success)
    fmt.Println("عمل ناکام ہوا:", fail)
}

بولین قیمتیں عموماً شرائطی عبارات میں استعمال ہوتی ہیں:

package main
import "fmt"

func main() {
    a := 10
    b := 20
    fmt.Println("a == b:", a == b) // غلط
    fmt.Println("a < b:", a < b)   // ٹھیک
}

5 اسٹرنگ ڈیٹا ٹائپ

5.1 اسٹرنگ کا جائزہ

اسٹرنگ حروف کا ایک جمع ہے۔ Go زبان میں، اسٹرنگز غیر قابل تبدیل ہیں۔ ہر اسٹرنگ دو حصوں پر مشتمل ہوتا ہے: بنیادی بائٹ آرے کو اشارہ اور لمبائی۔ اسٹرنگز میں ہر قسم کا ڈیٹا ہو سکتا ہے، شامل ہے بائٹس۔

5.2 اسٹرنگ متغیرات کا استعمال

اسٹرنگ متغیرات عموماً دوہرے انوٹیشن " کا استعمال کرکے تشکیل دیے جاتے ہیں، لیکن آپ ملٹی لائن اسٹرنگ کے لئے بھی بیکٹھکس ` کا استعمال کرسکتے ہیں:

package main
import "fmt"

func main() {
    var s1 string = "ہیلو"
    s2 := "دنیا"
    s3 := `یہ ایک
    ملٹی لائن
    اسٹرنگ ہے`
    fmt.Println(s1)
    fmt.Println(s2)
    fmt.Println(s3)
}

اسٹرنگ ایک بار بن گئی ہوتی ہے، اس کی مواد تبدیل نہیں کی جا سکتیں۔ زیریں عمل غیر قانونی ہے اور یہ کمپائل کی خرابی وجہ بنے گا:

s := "ہیلو"
s[] = 'H` // کمپائل کی خرابی: اسٹرنگ کی مواد قابل تغیر نہیں ہوتی

5.3 اسٹرنگ کے عمل

اسٹرنگز پروگرامنگ میں بہت عام اور اہم ہوتے ہیں۔ Go زبان میں ہمیں اسٹرنگ کے عمل کے لئے مکمل فراہم کردہ فنکشنز موجود ہیں۔ یہاں کچھ عام عملیات دی گئی ہیں۔

5.3.1 اسٹرنگ جوڑنا

Go زبان میں، آپ اسٹرنگز کو جوڑنے کے لئے پلاس عملی کا استعمال کرسکتے ہیں (+)، جو سب سے سیدھی میتھوڈ ہے۔ اس کے علاوہ، اگر آپ کئی اسٹرنگز کو بار بار جوڑتے ہیں تو بہتر کارکردگی کے لئے strings.Builder کا استعمال کرنا مشورہ دیا جاتا ہے۔

package main

import (
    "fmt"
    "strings"
)

func main() {
    // پلاس عملی کا استعمال کرتے ہوئے اسٹرنگز جوڑنا
    hello := "ہیلو، "
    world := "دنیا!"
    result := hello + world
    fmt.Println(result) // اوٹپٹ: ہیلو، دنیا!

    // strings.Builder استعمال کرتے ہوئے اسٹرنگز جوڑنا
    var sb strings.Builder
    sb.WriteString("ہیلو، ")
    sb.WriteString("دنیا!")
    fmt.Println(sb.String()) // اوٹپٹ: ہیلو، دنیا!
}

5.3.2 سٹرنگ کی تقسیم

سٹرنگ کی تقسیم کو مخصوص ڈیلیمٹر کے مطابقت پر سلائس میں تقسیم کرنے والے strings.Split فنکشن کا استعمال کر کے کیا جا سکتا ہے۔

package main

import (
    "fmt"
    "strings"
)

func main() {
    // ایک سٹرنگ کی تعریف کریں
    sentence := "Go is an open source programming language"

    // سٹرنگ کو خالی جگہ سے تقسیم کریں
    words := strings.Split(sentence, " ")
    for _, word := range words {
        fmt.Printf("%s\n", word)
    }
    // ایشو:
    // Go
    // is
    // an
    // open
    // source
    // programming
    // language
}

5.3.3 انڈیکس رسائی

Go میں، ایک سٹرنگ غیر قابل تبدیل بائٹوں کا تسلسل ہوتا ہے۔ آپ ایک مخصوص بائٹ کو رسائی حاصل کرنے کے لیے انڈیکسنگ کا استعمال کر سکتے ہیں۔ البتہ، اس بات کا خیال رکھنا اہم ہے کہ کسی بھی سٹرنگ میں مالٹی بائٹ کریکٹر (مثلاً یو ٹی ایف-8 اینکوڈڈ کریکٹر) موجود ہو سکتے ہیں، لہذا براہ کرم یاد رکھیں کہ سیدھی انڈیکسنگ متوقع سنگل کریکٹر نہیں دے سکتی۔

package main

import "fmt"

func main() {
    s := "Hello, 世界"
    for i := ; i < len(s); i++ {
        fmt.Printf("%d: %x\n", i, s[i])
    }
    // نوٹ: یہ باہر نکلے گا بائٹوں کے شمسی ترتیب کی ہیکساڈیسمل نمائندگی دے گا، کریکٹر نہیں
}

سٹرنگ کو کریکٹر کے ذریعے چلانے کے لیے آپ range لوپ کا استعمال کر سکتے ہیں۔

package main

import "fmt"

func main() {
    s := "Hello, 世界"
    for index, runeValue := range s {
        fmt.Printf("%d: %U '%c'\n", index, runeValue, runeValue)
    }
    // اوٹپٹ: ہر کریکٹر کے لیے انڈیکس، یونیکوڈ انکوڈنگ، اور خود کریکٹر
}

5.3.4 لمبائی حاصل کرنا

len فنکشن سٹرنگ کی لمبائی حاصل کر سکتا ہے، یعنی زیریں بائٹ سیریکوئنس کی لمبائی۔ یو ٹی ایف-8 سٹرنگ کیلئے، اگر آپ کو کریکٹرز (رون) کی تعداد حاصل کرنی ہو، تو آپ utf8.RuneCountInString فنکشن کا استعمال کریں۔ یہ مالٹی بائٹ کریکٹرز کو صحیح طریقے سے ہینڈل کر سکتا ہے۔

package main

import (
    "fmt"
    "unicode/utf8"
)

func main() {
    s := "Hello, 世界"
    fmt.Println("بائٹس لمبائی:", len(s)) // بائٹ لمبائی کو اوٹپٹ کریں
    fmt.Println("رون لمبائی:", utf8.RuneCountInString(s)) // کریکٹر لمبائی کو اوٹپٹ کریں
}

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