স্লাইস এবং ম্যাপ পেতে

মনে রাখুন যখন ম্যাপ বা স্লাইস ফাংশন প্যারামিটার হিসেবে পাঠানো হয়, যদি আপনি তাদের একটি রেফারেন্স সংরক্ষণ করতেন, তবে ব্যবহারকারীরা তাদের সম্পাদনা করতে পারেন।

অনুশীলিত পদক্ষেপ:

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()