स्लाइस और मैप प्राप्त करना

याद रहे कि जब एक मैप या स्लाइस को फ़ंक्शन पैरामीटर के रूप में पास किया जाता है, तो अगर आप उन्हें संदर्भ में रखते हैं, तो उपयोगकर्ताओं द्वारा उन्हें संशोधित किया जा सकता है।

अनुशंसित दृष्टिकोण:

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
}

// Snapshot returns the current state
func (s *Stats) Snapshot() map[string]int {
  s.mu.Lock()
  defer s.mu.Unlock()

  return s.counters
}

// स्नैपशॉट अब म्यूटेक्स द्वारा संरक्षित नहीं है,
// इसलिए स्नैपशॉट का कोई भी पहुंच डाटा दौड़ और स्टैट्स.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()