স্লাইস এবং ম্যাপ পেতে
মনে রাখুন যখন ম্যাপ বা স্লাইস ফাংশন প্যারামিটার হিসেবে পাঠানো হয়, যদি আপনি তাদের একটি রেফারেন্স সংরক্ষণ করতেন, তবে ব্যবহারকারীরা তাদের সম্পাদনা করতে পারেন।
অনুশীলিত পদক্ষেপ:
func (d *Driver) SetTrips(trips []Trip) {
d.trips = trips
}
trips := ...
d1.SetTrips(trips)
// আপনি কি চেষ্টা করছেন d1.trips সম্পাদনা করার?
trips[0] = ...
সুপারিশযোগ্য পদক্ষেপ:
func (d *Driver) SetTrips(trips []Trip) {
d.trips = make([]Trip, len(trips))
copy(d.trips, trips)
}
trips := ...
d1.SetTrips(trips)
// এখানে আমরা trips[0] সম্পাদনা করি, তবে এটি d1.trips এ প্রভাব ফেলবে না
trips[0] = ...
স্লাইস বা ম্যাপ রিটার্ন করা
একেইরকম মানুষের মানুষের ম্যাপ বা স্লাইসকে সংক্রান্ত অবস্থান সংক্রান্ত হওয়া থেকে সাবধান থাকুন।
অনুশীলিত পদক্ষেপ:
type Stats struct {
mu sync.Mutex
counters map[string]int
}
// স্ন্যাপশটটি বর্তমান অবস্থা ফিরিয়ে দেয়
func (s *Stats) Snapshot() map[string]int {
s.mu.Lock()
defer s.mu.Unlock()
return s.counters
}
// স্ন্যাপশট বর্তমানে মিউটেক্স দ্বারা সুরক্ষিত নয়
// তাই যেকোনো স্ন্যাপশটে অ্যাক্সেস ডাটা রেস এর শিকার হবে এবং অবস্থান গণনা প্রভাবিত হবে
snapshot := stats.Snapshot()
সুপারিশযোগ্য পদক্ষেপ:
type Stats struct {
mu sync.Mutex
counters map[string]int
}
func (s *Stats) Snapshot() map[string]int {
s.mu.Lock()
defer s.mu.Unlock()
result := make(map[string]int, len(s.counters))
for k, v := range s.counters {
result[k] = v
}
return result
}
// স্ন্যাপশট এখন একটি কপি
snapshot := stats.Snapshot()