2015-02-20 9 views
5

द्वारा पास किया गया है, मैं एक http अनुरोध करने के लिए एक फ़ंक्शन को कॉल कर रहा हूं, संदर्भ पैरामीटर द्वारा दो पास फ़ंक्शन के लिए उपयोग किया जाता है। मैं [] बाइट वी इंटरफ़ेस को पास करता हूं। मैं चाहता हूं कि फ़ंक्शन v इंटरफ़ेस संदर्भ मान को अपडेट करे। प्रतिक्रिया शरीर एक स्ट्रिंग है, मैं स्ट्रिंग मान को वी इंटरफ़ेस में पास करना चाहता हूं। हालांकि, कई तरीकों की कोशिश की लेकिन सफलता नहीं।गोलांग संदर्भ संदर्भ मान

यहां कोड है, आप देख सकते हैं कि bytsv.(*[]byte) के रूप में v को प्रतिक्रिया निकाय के स्ट्रिंग मान के साथ अद्यतन करने के लिए घोषित किया गया है। लेकिन यह काम नहीं करता है। v हमेशा nil है। कृपया v को स्ट्रिंग मान के साथ अपडेट किया जा सकता है।

func (s *BackendConfiguration) Do(req *http.Request, v interface{}) error { 
    res, err := s.HTTPClient.Do(req) 
    defer res.Body.Close() 
    resBody, err := ioutil.ReadAll(res.Body) 

    if v != nil { 
      byts, ok := v.(*[]byte) 
      if len(resBody) > 0 {   
       byts = append(byts, resBody...) 
       return nil 
      } 
     } 
    } 

    return nil 
} 
+1

'क्यों वापस नहीं (इंटरफ़ेस {}, अरे)'? इस तरह आप – serejja

+2

को जोड़ने के बाद 'रिटर्न बाइट्स, शून्य' का उपयोग कर सकते हैं, मैं सिर्फ यह इंगित करना चाहता हूं कि यह अभी भी मूल्य से गुजरता है ... हालांकि मूल्य की प्रतिलिपि बनाई गई है, सूचक नहीं है .. यह क्या इंगित करता है ... # nitpick –

+2

कृपया हमें कोड दिखाएं कि आप इसे 'Do()' विधि कैसे कहते हैं। कृपया 'ठीक' चर की जांच करें। लेकिन सबसे अधिक संभावना है कि आप 'v 'प्रकार पास करते हैं ** ** ** ** प्रकार के प्रकार ** नहीं है! – icza

उत्तर

8

ठीक है, इसका मुख्य कारण यह काम नहीं करता है, क्योंकि आप "संदर्भ द्वारा कॉल" के बारे में सोच, एक अवधारणा पूरी तरह से अज्ञात जाने के लिए। बिल्कुल सबकुछ गो में मूल्य से बुलाया जाता है और एक बार जब आप बाइट स्लाइस क्या करते हैं, एक बाइट स्लाइस के लिए पॉइंटर, इंटरफ़ेस के अंदर लिपटे बाइट स्लाइस के लिए एक सूचक, इंटरफ़ेस से निकाले गए बाइट स्लाइस में पॉइंटर की एक प्रति, और इसलिए आप पर मूल्य के लिए बाइट टुकड़ा अंक के सूचक अपडेट करने का तरीका देखेंगे:

package main 
import "fmt" 
func f(v interface{}) { 
    pbs := v.(*[]byte) 
    *pbs = append(*pbs, []byte{9,8,7}...) 
} 
func main() { 
    bs := []byte{1,2,3} 
    pbs := &bs 
    var v interface{} = pbs 
    f(v) 
    fmt.Printf("%v\n", *pbs) 
} 
+0

बहुत बहुत धन्यवाद। यह काम करता हैं। –

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