স্লাইসেস

গো তে স্লাইস খুবই পাওয়ারফুল একটা ডাটা স্ট্রাকচার। এ্যারে যেখানে ফিক্সড লেংথ এর হয়, স্লাইস এর এরকম কোন লিমিটেশন নেই। তবে এ্যারের মত স্লাইসের ক্ষেত্রেও আমাদের টাইপ নির্দিষ্ট করে দিতে হয়।

আমরা make ফাংশনটি ব্যবহার করে স্লাইস তৈরি করতে পারি:

s := make([]string, 3)
fmt.Println("emp:", s)

এখানে আমরা একটি স্লাইস তৈরি করেছি যেটিতে আমরা স্ট্রিং স্টোর করবো এবং ইনিশিয়ালি ৩টি আইটেমের জন্য মেমোরী এ্যালোকেট করা হবে। এই ৩টি আইটেমের ইনিশিয়াল ভ্যালু হবে "জিরো ভ্যালু" - অর্থাৎ সংশ্লিস্ট টাইপ (এক্ষেত্রে স্ট্রিং) এর শুন্যর সম মানের ভ্যালু। স্ট্রিং এর ক্ষেত্রে জিরো ভ্যালু হলো ফাকা স্ট্রিং।

আউটপুট:

emp: [ ]

আমরা এ্যারের মত করেই ইনডেক্স ব্যবহার করে স্লাইসের আইটেমগুলো এ্যাক্সেস করতে পারি:

fmt.Println("set:", s)
s[0] = "a"
s[1] = "b"
s[2] = "c"
fmt.Println("get:", s[2])

আউটপুট:

set: [ ]
get: c

স্লাইসের লেংথ জানতে আমরা len ফাংশনটি ব্যবহার করি:

fmt.Println("len:", len(s))

আউটপুট:

len: 3

এবং স্লাইসের শেষে যোগ করতে আমরা append ফাংশনটি ব্যবহার করতে পারি:

s = append(s, "d")
s = append(s, "e", "f")
fmt.Println("apd:", s)

আউটপুট:

apd: [a b c d e f]

copy ফাংশনটি ব্যবহার করে আমরা স্লাইস টু স্লাইস কপি করতে পারি:

c := make([]string, len(s))
copy(c, s)
fmt.Println("cpy:", c)

আউটপুট:

cpy: [a b c d e f]

স্লাইসের সবচেয়ে গুরুত্বপূর্ন বৈশিষ্ট্য হলো এর স্লাইসিং অপারেটর। যেমন:

l := s[2:5]
fmt.Println("sl1:", l)

আউটপুট:

sl1: [c d e]

এখানে আমরা s স্লাইসের ইনডক্স 2 (অর্থাৎ ৩য় আইটেম) থেকে শুরু করে ইনডেক্স 5 এর আগ পর্যন্ত, অর্থাৎ ইনডেক্স 4 বা ৫ম আইটেম পর্যন্ত l এ এ্যাসাইন করবো। এই অপারেশনের পর l হবে একটি নতুন স্লাইস যেটায় থাকবে s[2], s[3] এবং s[4] এর ভ্যালু।

আমরা যদি প্রথম অংশ উহ্য রাখি সেক্ষেত্রে স্লাইসের একেবারে শুরু থেকে নতুন স্লাইস শুরু হবে:

l = s[:5]
fmt.Println("sl2:", l)

এটার ভ্যালু হবে s[0] থেকে s[4] পর্যন্ত। আউটপুট:

sl2: [a b c d e]

মনে রাখতে হবে স্লাইসের প্রথম অংশ ইনক্লুসিভ, অর্থাৎ প্রথম অংশে যেই ইনডেক্স থাকে সেটি নতুন স্লাইসের শুরু, আর শেষ ভাগে যেই ইনডেক্স থাকে সেটা এক্সক্লুসিভ, অর্থাৎ সেটির আগ পর্যন্ত নতুন স্লাইসের অন্তর্গত হয়।

l = s[2:]
fmt.Println("sl3:", l)

এটার আউটপুট:

sl3: [c d e f]

make ফাংশনটি ব্যবহার না করেও আমরা একই লাইনে স্লাইস ডিক্লেয়ার এবং ইনিশিয়ালাইজ করতে পারি এই শর্টহ্যান্ড সিনট্যাক্স ব্যবহার করে:

t := []string{"g", "h", "i"}
fmt.Println("dcl:", t)

এটার আউটপুট:

dcl: [g h i]