Go-তে Slices এর ধারণা এবং এর ব্যবহার
১. Slices (স্লাইস)
Go-তে Slices একটি গুরুত্বপূর্ণ ডেটা স্ট্রাকচার, যা একটি অ্যারে (array)-এর উপর ভিত্তি করে তৈরি হয়, কিন্তু এতে কিছু অতিরিক্ত সুবিধা রয়েছে যা অ্যারের চেয়ে অনেক বেশি নমনীয় এবং সহজে ব্যবহারযোগ্য। স্লাইস অ্যারে এর একটি অংশ (sub-array) এবং এটি এক্সটেন্ড, কাট (resize) করা যেতে পারে, যা সাধারণ অ্যারে-তে সম্ভব নয়। স্লাইস মূলত ডাইনামিক অ্যারে হিসাবে কাজ করে।
১.১ Slices এবং Arrays এর পার্থক্য
- Arrays: অ্যারে হল একটি ফিক্সড সাইজের ডেটা স্ট্রাকচার, যার আকার একবার নির্ধারিত হলে তা পরিবর্তন করা যায় না।
- Slices: স্লাইস হলো এক ধরনের লেন্থ-লিমিটেড ডেটা স্ট্রাকচার, যার সাইজ পরিবর্তন করা যায়।
১.২ Slices ডেফিনিশন
Slices হল একটি প্রকারের ডেটা স্ট্রাকচার যা একাধিক মান ধারণ করে, কিন্তু এগুলোর সাইজ ফিক্সড নয়। স্লাইসের ডিফল্ট সাইজ এবং ক্যাপাসিটি পরিবর্তনশীল হয়।
Slices তিনটি মূল উপাদান ধারণ করে:
- Pointer: এটি স্লাইসের প্রথম উপাদানটির মেমরি অ্যাড্রেস ধারণ করে।
- Length: স্লাইসের বর্তমান সাইজ।
- Capacity: স্লাইসের মোট স্টোরেজ ক্ষমতা (এটি স্লাইসের ইনিশিয়ালাইজেশনের পর বৃদ্ধি পেতে পারে)।
২. Slices এর ব্যবহার
২.১ Slice তৈরি করা
Go-তে স্লাইস তৈরি করার কিছু সাধারণ পদ্ধতি রয়েছে:
১. Literal Slices
package main
import "fmt"
func main() {
// স্লাইস তৈরি করা
numbers := []int{10, 20, 30, 40}
fmt.Println(numbers) // আউটপুট: [10 20 30 40]
}এখানে, numbers একটি স্লাইস যার মধ্যে চারটি মান রয়েছে। স্লাইসের সাইজ ও ক্যাপাসিটি স্বয়ংক্রিয়ভাবে ঠিক করা হয়।
২. Empty Slice
package main
import "fmt"
func main() {
var emptySlice []int // শূন্য স্লাইস
fmt.Println(emptySlice) // আউটপুট: []
}এখানে, একটি শূন্য স্লাইস তৈরি করা হয়েছে এবং আউটপুট হবে একটি খালি স্লাইস।
২.২ Slice Initialization with make
make ফাংশন ব্যবহার করে স্লাইস তৈরি করা যায়, যেখানে আপনি স্লাইসের লেন্থ এবং ক্যাপাসিটি নির্দিষ্ট করতে পারেন:
package main
import "fmt"
func main() {
// make ফাংশন দিয়ে স্লাইস তৈরি
slice := make([]int, 5, 10) // স্লাইসের লেন্থ 5 এবং ক্যাপাসিটি 10
fmt.Println(slice) // আউটপুট: [0 0 0 0 0]
fmt.Println(len(slice)) // আউটপুট: 5
fmt.Println(cap(slice)) // আউটপুট: 10
}এখানে, make ফাংশন দিয়ে একটি স্লাইস তৈরি করা হয়েছে যার লেন্থ ৫ এবং ক্যাপাসিটি ১০। এর ফলে, স্লাইসটি ফিক্সড সাইজের, কিন্তু এটি ১০টি মান ধারণ করতে সক্ষম।
২.৩ Slice Indexing এবং Slicing
স্লাইসের একটি অংশ বের করা যায়। এটি অ্যারে স্লাইসিংয়ের মতোই কাজ করে।
package main
import "fmt"
func main() {
numbers := []int{10, 20, 30, 40, 50, 60}
// স্লাইসিং
part := numbers[2:5] // এখানে indices 2 থেকে 4 পর্যন্ত স্লাইস হবে
fmt.Println(part) // আউটপুট: [30 40 50]
}এখানে, numbers[2:5] দ্বারা স্লাইসিং করা হয়েছে, যার ফলে 30, 40, এবং 50 থাকবে। এই রেঞ্জটি প্রথম ইনডেক্স থেকে দ্বিতীয় ইনডেক্সের আগে পর্যন্ত হবে।
২.৪ Append Function with Slice
Go তে স্লাইসের সাথে নতুন উপাদান যোগ করতে append ফাংশন ব্যবহার করা হয়। স্লাইসের শেষে নতুন মান যোগ করা হয়, এবং প্রয়োজনে স্লাইসের আকার বৃদ্ধি পায়।
package main
import "fmt"
func main() {
numbers := []int{10, 20, 30}
numbers = append(numbers, 40, 50) // নতুন উপাদান যোগ করা
fmt.Println(numbers) // আউটপুট: [10 20 30 40 50]
}এখানে, append ফাংশনটি নতুন মান যোগ করে এবং স্লাইসটির আকার বাড়িয়ে দেয়।
২.৫ Slice Capacity এবং Length
len এবং cap ফাংশন ব্যবহার করে আপনি স্লাইসের দৈর্ঘ্য এবং ক্যাপাসিটি বের করতে পারেন।
package main
import "fmt"
func main() {
numbers := []int{10, 20, 30, 40, 50}
fmt.Println("Length:", len(numbers)) // আউটপুট: 5
fmt.Println("Capacity:", cap(numbers)) // আউটপুট: 5 (যেহেতু slice তৈরি হয়েছিল 5 উপাদান দিয়ে)
}len: স্লাইসের বর্তমান সাইজ, অর্থাৎ এর মধ্যে কয়টি উপাদান রয়েছে।cap: স্লাইসের ক্যাপাসিটি, অর্থাৎ এটি কতগুলো উপাদান ধারণ করতে সক্ষম।
৩. Slices এর অন্যান্য ব্যবহার
৩.১ Slice Copying
স্লাইসের কপি তৈরি করতে copy ফাংশন ব্যবহার করা হয়। এটি একটি স্লাইসের মান অন্য একটি স্লাইসে কপি করে।
package main
import "fmt"
func main() {
numbers := []int{10, 20, 30, 40}
copyNumbers := make([]int, len(numbers)) // কপি স্লাইস তৈরি
copy(copyNumbers, numbers) // numbers স্লাইস থেকে copyNumbers স্লাইসে কপি করা
fmt.Println(copyNumbers) // আউটপুট: [10 20 30 40]
}এখানে, copy ফাংশনটি numbers স্লাইসের মান copyNumbers স্লাইসে কপি করেছে।
৩.২ Slices with Structs
আপনি স্লাইসের মধ্যে structs বা কাস্টম ডেটা টাইপও রাখতে পারেন।
package main
import "fmt"
// Struct ডিফাইন করা
type Person struct {
Name string
Age int
}
func main() {
people := []Person{
{"Alice", 30},
{"Bob", 25},
}
fmt.Println(people)
}এখানে, Person struct-কে স্লাইসে রাখা হয়েছে এবং আমরা স্লাইসটির মান প্রিন্ট করেছি।
সারসংক্ষেপ
- Slices হল Go-তে এমন একটি ডেটা স্ট্রাকচার যা অ্যারের একটি ভ্যারিয়েবল সাইজের অংশ। এটি ফ্লেক্সিবল এবং ডাইনামিক, যা একটি অ্যারের মতো আচরণ করে, তবে তার সাইজ পরিবর্তনশীল।
- Slices এর সুবিধা হল, এগুলির দৈর্ঘ্য এবং ক্যাপাসিটি স্বয়ংক্রিয়ভাবে পরিচালিত হয়, এবং এর মান যেকোনো সময়ে পরিবর্তন করা যায়।
- Slices ব্যবহার করে আপনি সহজেই ডেটার অংশ বের করতে পারেন (স্লাইসিং), নতুন উপাদান যোগ করতে পারেন (append), এবং কপি তৈরি করতে পারেন (copy)।
Slices Go-তে ডেটা ম্যানিপুলেশন এবং মেমরি ব্যবস্থাপনায় একটি অত্যন্ত শক্তিশালী টুল, যা কোডিংকে আরও সহজ এবং দক্ষ করে তোলে।
Read more