1 ম্যাপ সম্পর্কিত পরিচিতি
Go ভাষায়, ম্যাপ হল একটি বিশেষ ডেটা টাইপ যা পৃথক প্রকারের কী-মান জোড়া সংরক্ষণ করতে পারে। এটি পাইথনের ডিকশনারি অথবা জাভাতের হ্যাশম্যাপের মতো। Go তে, ম্যাপ হল একটি ভিত্তিক টাইপ যা একটি হ্যাশ টেবিল ব্যবহার করে প্রযোজ্য হয়, এটি দ্রুত ডেটা লুকআপ, আপডেট, এবং মোছার গুণগত প্রকৃতি প্রদান করে।
বৈশিষ্ট্যসমূহ
- স্মার্ট ধরন: ম্যাপটি হল একটি স্মার্ট ধরন, যা মানে যে, তৈরি হওয়ার পরে, এটি প্রাকৃতিক ডেটা স্ট্রাকচারের একটি পয়েন্টার পায়।
- গতিময় প্রসারণ: স্লাইসের মতো, ম্যাপের স্থানগুলি স্ট্যাটিক নয় এবং তার ডেটা বাড়তে গিয়ে প্রদর্শন করে।
- কীর অননিয়তা: ম্যাপে প্রতিটি কী অদ্বিতীয়, এবং যদি একই কীটি মান সংরক্ষণের জন্য ব্যবহৃত হয়, তবে নতুন মান বিদ্যমান মানটির উপরে লেখা হয়।
- অছানা সংগ্রহ: ম্যাপে উপাদানগুলি অছানা, তাই ম্যাপ প্রত্যাশিত যেকোনো সময় বিভিন্ন অবস্থায় কী-মান জোড়া অপারে।
ব্যবহারের উদাহরণ
- পরিসংখ্যান: অদৃশ্য কীর দ্বারা শীঘ্রই এলিমেন্ট গণনা করুন।
- ক্যাশিং: ঘটনা-মান জোড়া ব্যবস্থা করার জন্য দায়বদ্ধ মেকানিজম।
- ডাটাবেস সংযোগ পুল: ডেটাবেস সংযোগ সহ ব্যক্তি সংস্থানের একটি সেট পরিচালনা করুন, যাতে সম্পদগুলি ভাজিয়ে থাকতে এবং একাধিক গ্রাহকের দ্বারা ভাগবিভাগে প্রবেশ করা যেতে।
- বিন্যাস আইটেম ভন্ডার: বিন্যাস ফাইল থেকে প্যারামিটার সংরক্ষণ করার জন্য ব্যবহৃত।
2 ম্যাপ তৈরি করা
2.1 make
ফাংশন ব্যবহার করে তৈরি করা
ম্যাপ তৈরি করার সবচেয়ে সাধারণ উপায় হ'ল make
ফাংশন ব্যবহার করা, যা নিম্নলিখিত সিনট্যাক্স দিয়ে:
make(map[keyType]valueType)
এখানে, keyType
হ'ল কীর প্রকার, এবং valueType
হ'ল মানের প্রকার। নিচে উদাহরণ উল্লেখ করা হল:
// একটি স্ট্রিং কীর প্রকার এবং একটি পূর্ণসংখ্যা মানের ধরনসমূহে সংরক্ষণের জন্য ম্যাপ তৈরি করুন
m := make(map[string]int)
উদাহরণটির মাধ্যমে, আমরা একটি ফাঁকা ম্যাপ তৈরি করেছি যা স্ট্রিং কী এবং পূর্ণসংখ্যা মান সংরক্ষণ করতে ব্যবহার করা হয়।
2.2 ছাড়াগুলি সিনট্যাক্স দিয়ে তৈরি করা
make
ব্যবহার করার ছাড়া, আমরা ছাড়াগুলি সিনট্যাক্স ব্যবহার করে একটি ম্যাপ তৈরি এবং জাতীয়তা দিয়ে একটি ম্যাপে নীতিহীন করতে পারি:
m := map[string]int{
"apple": 5,
"pear": 6,
"banana": 3,
}
এটি না কেবল একটি ম্যাপ তৈরি করে, বরং এর জন্য তিনটি কী-মান জোড়াও তার জন্য বোঝায়।
2.3 ম্যাপ বিস্তারিত পরিকল্পনা
ম্যাপ ব্যবহার করার সময়, মূল ম্যাপের শূন্য মানটি নিল
এবং এই অংশে প্রারম্ভ করার আগে আপনাকে এটি ইনিশিয়ালাইজ করতে দরকার, অন্যথায় এটি একটি রানটাইম প্যানিক সৃষ্টি করবে।:
var m map[string]int
if m == nil {
m = make(map[string]int)
}
// এখন m ব্যবহার করা নিরাপদ
এটি এরও উল্লেখযোগ্য যে ম্যাপে কীটি বিদ্যমান কিনা তা চেক করার জন্য বিশেষ সিনট্যাক্স আছে:
value, ok := m["key"]
if !ok {
// "key" ম্যাপে নেই
}
এখানে, value
হ'ল প্রদত্ত কীর সাথে সংযুক্ত মান, এবং ok
একটি বুলিয়ান মানয়, যা ম্যাপে কী বিদ্যমান হলে true
এবং না হলে false
হবে।
3 ম্যাপে অ্যাক্সেস এবং পরিবর্তন
3.1 উপাদান অ্যাক্সেস করা
Go ভাষায়, আপনি একটি ম্যাপে উপাদান এক্সেস করতে ব্যবহার করে কী নির্দিষ্ট করে মানের সাথে সাথে। যদি ম্যাপে কীটি বিদ্যমান হয়, তবে আপনি সংশ্লিষ্ট মানটি পাবেন। তবে, যদি ম্যাপে কীটি বিদ্যমান না থাকে, তবে আপনি মানের শূন্য মান পাবেন। উদাহরণস্বরূপ, সংখ্যা রাখা ম্যাপে, যদি কীটি অস্তিত্ব না থাকে, তবে এটি 0
পেতে।
func main() {
// একটি ম্যাপ সংরক্ষণ করুন
scores := map[string]int{
"Alice": 92,
"Bob": 85,
}
// অস্তিত্ব রয়েছে একটি মৌজুদ কী
aliceScore := scores["Alice"]
fmt.Println("Alice's score:", aliceScore) // আউটপুট: Alice's score: 92
// অস্তিত্ব নেই একটি মৌজুদ কী
missingScore := scores["Charlie"]
fmt.Println("Charlie's score:", missingScore) // আউটপুট: Charlie's score: 0
}
নোট করুন যে, "Charlie" কীটি অস্তিত্ব না থাকা এবং স্থানীয়ভাবে না থাকা মানে, তা কোনো ত্রুটি সৃষ্টি করবে না, এবং পরিবর্তন বিনি মূল মান 0
প্রদান করবে।
3.2 কী বিদ্যমানতা পরীক্ষা
কিছু সময়, আমরা ম্যাপে কী বিদ্যমান আছে তা জানতে চাই, আর তার মানে সহ চিন্তা না করা। এই প্রস্তুতির মধ্যে, ম্যাপ অ্যাক্সেসের দ্বিতীয় রিটার্ন মানটি ব্যবহার করতে পারবেন। এই বুলিয়ান রিটার্ন মানটি আমাদেরকে বলবে কী ম্যাপে কী বিদ্যমান আছে বা না।
func main() {
scores := map[string]int{
"Alice": 92,
"Bob": 85,
}
// "Bob" কী বিদ্যমান আছে কিনা চেক করা
score, exists := scores["Bob"]
if exists {
fmt.Println("Bob-এর স্কোর:", score)
} else {
fmt.Println("Bob-এর স্কোর খুঁজে পাওয়া যায়নি।")
}
// "Charlie" কী বিদ্যমান আছে কিনা চেক করা
_, exists = scores["Charlie"]
if exists {
fmt.Println("Charlie-এর স্কোর পাওয়া গিয়েছে।")
} else {
fmt.Println("Charlie-এর স্কোর খুঁজে পাওয়া যায়নি।")
}
}
এই উদাহরণে, আমরা একটি if বিবৃতিতে একটি বুলিয়ান মানের চেক করার জন্য ব্যবহার করি।
3.3 উপাদান যোগ করা এবং আপডেট করা
ম্যাপে নতুন উপাদান যোগ করা এবং বিদ্যমান উপাদান আপডেট করা একই সিনট্যাক্স ব্যবহার করে। যদি কী আগে থাকে, তার মৌলিক মান নতুন মানে পরিবর্তন করা হবে। যদি কী বিদ্যমান না থাকে, তাহলে নতুন কী-মান জোড়া যোগ করা হবে।
func main() {
// একটি ফাঁকা ম্যাপ সংজ্ঞায়িত করুন
scores := make(map[string]int)
// উপাদান যোগ করা
scores["Alice"] = 92
scores["Bob"] = 85
// উপাদান আপডেট করা
scores["Alice"] = 96 // বিদ্যমান কী আপডেট করা
// ম্যাপ প্রিন্ট করা
fmt.Println(scores) // আউটপুট: map[Alice:96 Bob:85]
}
উপাদান যোগ ও আপডেট অপারেশনগুলি সংক্ষেপণশীল এবং সহজ ধারন করা যায়।
3.4 উপাদান মোছা
ম্যাপ থেকে উপাদান সরানো একটি নির্মিত delete
ফাংশন ব্যবহার করে করা যেতে। নিম্নলিখিত উদাহরণ মোছার অপারেশনটি নিয়ে প্রদর্শন করে।
func main() {
scores := map[string]int{
"Alice": 92,
"Bob": 85,
"Charlie": 78,
}
// একটি উপাদান মোছা
delete(scores, "Charlie")
// ম্যাপটি প্রিন্ট করা, যাতে দেখা যায় Charlie মোছা হয়েছে কিনা
fmt.Println(scores) // আউটপুট: map[Alice:92 Bob:85]
}
delete
ফাংশনটি দুটি প্যারামিটার গ্রহণ করে, প্রথম প্যারামিটার হিসেবে ম্যাপটি এবং দ্বিতীয় প্যারামিটার হিসেবে মোছার জন্য কী গ্রহণ করে। যদি ম্যাপে কী বিদ্যমান না থাকে, তবে delete
ফাংশন কোনও প্রভাব বা ত্রুটি ছুঁড়ে দেয় না।
4. ম্যাপে ভ্রমণ
Go ভাষায়, আপনি for range
বিবৃতিতে ব্যবহার করে ম্যাপ ডেটা স্ট্রাকচারের ভ্রমণ করার জন্য এবং কন্টেনারের প্রত্যেক কী-মান অ্যাক্সেস করার জন্য ব্যবহার করতে পারেন। এই ধরনের লুপ ভ্রমণ অপারেশনটি ম্যাপ ডেটা স্ট্রাকচার দ্বারা সমর্থিত একটি মৌলিক অপারেশন।
4.1 for range
ব্যবহার করে ম্যাপ উপরে ভ্রমণ করা
for range
বিবৃতিতে ম্যাপে সরাসরি ব্যবহার করা যেতে পারে ম্যাপে প্রত্যেক কী-মান জানতে। নিচে একটি ম্যাপে for range
ব্যবহার করার একটি মৌলিক উদাহরণ দেওয়া হল:
package main
import "fmt"
func main() {
myMap := map[string]int{"Alice": 23, "Bob": 25, "Charlie": 28}
for key, value := range myMap {
fmt.Printf("Key: %s, Value: %d\n", key, value)
}
}
এই উদাহরণে, key
ভেরিয়েবলটি বর্তমান ভ্রমণের কী-মানে অ্যাসাইন করা হয় এবং value
ভেরিয়েবলটি ঐ কী-মানের সাথে সংযুক্ত মানটি অ্যাসাইন করা হয়।
4.2 ভ্রমণ অর্ডারের প্রতিজ্ঞাপন
ম্যাপে ভ্রমণ করার সময়, মনে রাখা গুরুত্বপূর্ণ যে, ভ্রমণের অর্ডারটি প্রতিস্থাপন উপভোগ করা জাতীয় নয়, এমনটি ম্যাপের বিষয়বস্তু পরিবর্তিত না হয়তোবা না হয়। এটা কারণে, গোভাষায় ম্যাপের উপর ভ্রমণ প্রক্রিয়াটি এলোমেলো করার জন্য ডিজাইন করা হয়েছে, যাতে প্রোগ্রামটি কোনও নির্দিষ্ট ভ্রমণ অর্ডারে নির্ভর না করে, তাড়াতাড়ি কোডের দৃঢতা বাড়াতে।
উদাহরণস্বরূপ, দুটি বার একই কোড চালানো এক পর অপর ভিন্ন আউটপুট দেয়:
package main
import "fmt"
func main() {
myMap := map[string]int{"Alice": 23, "Bob": 25, "Charlie": 28}
fmt.Println("First iteration:")
for key, value := range myMap {
fmt.Printf("Key: %s, Value: %d\n", key, value)
}
fmt.Println("\nSecond iteration:")
for key, value := range myMap {
fmt.Printf("Key: %s, Value: %d\n", key, value)
}
}
5 ভার্সনের উপরে এমবিপিতা
রুলিফের্য়ের পছন্দমত আর ব্যাক্তিগত আলোচনায় অনুপ্রেরণা নিতে নেয়ার পার্থক্য করতে অপ্সীন ম্যামু আর ম্যাপস সম্পর্কিত এই ৫ টি উন্নত বিষয়বস্তু দেখানো হবে।
5.1 ম্যাপসের মেমরি আর পারফরমেন্স গুণাগুণ
গো ভাষায়, ম্যাপস একটি অনেক বচনৎ আর টপুতজদা ডেটা টাইপ, আর পরিণামে তারা মেমরি ব্যাবহার আর পারফরমেন্স সম্পর্কে নির্দিষ্ট গুণাগুণ রাখে। উদাহরণস্বরূপ, ম্যাপসের আকার প্রসারিত হতে পারে, আর যখন সংরক্ষিত উপাদানগুলির সংখ্যা বর্তমান ধারনাতে অধিক হয়, তবে ম্যাপটি নিজেই বাড়াতে চাইলে কূটনাটির জন্য একটি বড় স্টোরেজ স্পেস পুনরায় বরাদ্ধ করবে।
এই ডায়নামিক বৃদ্ধির জন্য সর্বোত্তম পারফরমেন্সের জন্য, ম্যাপ তৈরি করার সময় একটি যোগ্য আদি ধারণা নির্ধারণ করতে পারেন। উদাহরণস্বরূপ:
myMap := make(map[string]int, 100)
এটি রানটাইমে ম্যাপের সচল স্পোনের ওভারহেড কমিয়ে দেওয়ার জন্য প্রাথমিক ধারণার ক্ষরমা হতে পারে।
5.2 ম্যাপসের রেফারেন্স প্রকারের গুণাগুণ
ম্যাপস রেফারেন্স টাইপ, যেটা অর্থ করে যখন আপনি একটি ভেরিয়েবলকে অন্য ভেরিয়েবলে ম্যাপ দিবেন, তবে নতুন ভেরিয়েবলটি মূল ম্যাপের সমান ডেটা গঠনের রেফারেন্স করবে। এটা মানেও যে, যদি নতুন ভেরিয়েবল দিয়ে ম্যাপে পরিবর্তন করেন, এই পরিবর্তনগুলি ওই মূল ম্যাপ ভেরিয়েবলেও প্রতিফলিত হবে।
নিচে একটি উদাহরণ:
package main
import "fmt"
func main() {
originalMap := map[string]int{"Alice": 23, "Bob": 25}
newMap := originalMap
newMap["Charlie"] = 28
fmt.Println(originalMap) // আউটপুটে নতুনভাবে যুক্ত করা "Charlie": 28 কী-মান দেখা যাবে
}
একটি ফাংশন কলে একটি ম্যাপ যখন পাঠানোর সময়, রেফারেন্স টাইপ ব্যবহার করতে গুরুতর হতে পারে। এই পর্যায়ে, যা পাস করা হয়, তা ম্যাপের রেফারেন্স, কোপি নয়।
5.3 সমভাবনাশীলতা আর সিঙ্ক ম্যাপ
একটি বহু-থ্রেডেড পরিবেশে ম্যাপ ব্যবহার করার সময়, যদি সঠিকভাবে সমভাবনা না বজায় রাখা হয়, তবে সান্ত্বন বাধিত হতে পারে। গো মানক লাইব্রেরিতে sync.Map
টাইপ উপলব্ধ, যা একটি সন্তুষ্ট ম্যাপ, বিন্যাসিত বৃদ্ধি ও পারফরমেন্সের জন্য মানতানা করে। এই টাইপটি ম্যাপে প্রশাসনিক ধারণাগুলির উপর কাজ করার জন্য ভা দেওয়ার চালাঈ এলেম metavar.
নিচে sync.Map
ব্যবহার উদাহরণ:
package main
import (
"fmt"
"sync"
)
func main() {
var mySyncMap sync.Map
// কী-মান যুক্ত করা
mySyncMap.Store("Alice", 23)
mySyncMap.Store("Bob", 25)
// একটি কী-মান যেন প্রাপ্ত আর ছাপা হয়
if value, ok := mySyncMap.Load("Alice"); ok {
fmt.Printf("Key: Alice, Value: %d\n", value)
}
// Range মেথডটি ব্যবহার করে sync.Map দিয়ে ঘুরে বেড়ার জন্য
mySyncMap.Range(func(key, value interface{}) bool {
fmt.Printf("Key: %v, Value: %v\n", key, value)
return true // অবিবাদ চলানো
})
}
রেফারেন্সের চালানোয়া sync.Map
ব্যবহার করা, একটি নির্জন পরিবেশে ম্যাপ পরিবর্তন করার সময় শোধ অসাধু করতে পারে, তাই নিয়র সিকান নিশ্চিত হতে।