2015-02-07 7 views
11

मैं एक मानचित्र के माध्यम से लूप करने की कोशिश करता हूं, कि मैं एक फ़ंक्शन के लिए पॉइंटर के रूप में पास करता हूं, लेकिन मुझे तत्वों तक पहुंचने का कोई तरीका नहीं मिल रहा है। इस उदाहरण बदले मेंगोलांग: इसके संदर्भ का उपयोग कर मानचित्र तक पहुंच

func refreshSession(sessions *map[string]Session) { 
    now := time.Now() 
    for sid := range *sessions { 
     if now.After(*sessions[sid].timestamp.Add(sessionRefresh)) { 
      delete(*sessions, sid) 
     } 
    } 
} 

लाइन 4 संकलन त्रुटि निम्नलिखित:: इस कोड है

./controller.go:120: invalid operation: sessions[sid] (type *map[string]Session does not support indexing) 

मैं कोष्ठक की कोशिश की है, लेकिन यह कोई प्रभाव नहीं पड़ा। अगर मैं सभी संदर्भ ऑपरेटर (* &) ले जाता हूं तो यह ठीक संकलित करता है।

मुझे यह कैसे लिखना चाहिए?

उत्तर

21

आपको मानचित्र के साथ एक पॉइंटर का उपयोग करने की आवश्यकता नहीं है।

Map types are reference types, like pointers or slices[1]

आप Session आप एक सूचक इस्तेमाल कर सकते हैं बदलने के लिए की जरूरत है:

map[string]*Session

[1]https://blog.golang.org/go-maps-in-action

+0

प्रश्न अपडेट कर रहा है, क्या ऐसे मामले होंगे जहां x टाइप के सूचक होने के लिए मानचित्र की कुंजी रखना संभव है? – Roylee

+0

क्या आपका मतलब है 'नक्शा [* टी] स्ट्रिंग' जैसे कुछ? – jmaloney

8

आप * की प्राथमिकता को ध्यान में नहीं रख रहे हैं।

*session[sid] वास्तव में *(session[sid]) का अर्थ है, जो पहले पॉइंटर को मानचित्र (इसलिए त्रुटि) को अनुक्रमणित करता है, फिर इसे अस्वीकार कर देता है।

आपको (*session)[sid].timestamp का उपयोग मानचित्र पर पॉइंटर को पहले हटाना और फिर कुंजी का उपयोग करके इसे एक्सेस करना चाहिए।

+0

मैं इस कोशिश की, लेकिन मैं एक ही संदेश मिला। – Michael

+1

मुझे यह बहुत दुर्लभ लगता है। मैंने कोशिश की और यह काम करता है: http://play.golang.org/p/85Mj8RixGm। यदि @jmaloney समाधान आपके लिए काम करता है, तो क्या आप वाकई उसी कोड का उपयोग कर रहे हैं जिसे आपने यहां पोस्ट किया है? – siritinga

+0

मुझे कोड में अन्य समस्याएं थीं। तो यह बदल गया। मैंने उपरोक्त प्रश्न में इसे अद्यतन किया। लेकिन जब मैं सभी * और & "से छुटकारा पाने के बाद पहली बार समस्या का सामना कर चुका था। – Michael

6

डी-संदर्भ नक्शा पहले और उसके बाद इसे उपयोग:

(*sessions)[sid] 

यह भी उल्लेखनीय है कि नक्शे वास्तव में प्रकार का संदर्भ कर रहे हैं और इसलिए वहाँ संकेत का उपयोग करने का एक बहुत ही सीमित यूज-केस है। किसी फ़ंक्शन में नक्शा मान पास करने से सामग्री की प्रतिलिपि नहीं होगी। Example on play

+0

मैंने कोशिश की, लेकिन मुझे एक ही संदेश मिला। – Michael

+0

यह मेरे लिए काम करता है, एक नक्शा – Hokutosei

संबंधित मुद्दे