मान के बजाय श्रेणी संदर्भ


91

मैंने देखा कि सीमा मूल्य की कुंजी और "प्रतिलिपि" लौटाती है। क्या उस सीमा के लिए कोई रास्ता है जिससे कि वस्तु का पता लौटाया जा सके? उदाहरण

package main

import "fmt"

type MyType struct {
    field string
}

func main() {
    var array [10]MyType

    for _, e := range array {
        e.field = "foo"
    }

    for _, e := range array {
        fmt.Println(e.field)
        fmt.Println("--")
    }
}

http://play.golang.org/p/AFOGG9NGpx

यहां "फ़ील्ड" को संशोधित नहीं किया गया है क्योंकि रेंज फ़ील्ड की प्रतिलिपि भेजता है, क्या मुझे सूचकांक का उपयोग करना है या क्या मूल्य को संशोधित करने का कोई अन्य तरीका है?

पढ़ने के लिए धन्यवाद।



1
क्या आप सूचक के एक सरणी का उपयोग कर सकते हैं MyType?
nvcnvn

हां, यदि आप पॉइंटर्स की एक सरणी का उपयोग करते हैं, तो आप इंडेक्स का उपयोग किए बिना परिणाम को सीधे सरणी में संशोधित कर सकते हैं, यहां एक उदाहरण है। play.golang.org/p/_Vx7ONLDJs
notzippy

rangeठीक काम कर रहा है और यह वही देता है जो आपने स्लाइस के अंदर रखा है। यहाँ प्रकार के मान MyStruct(जो एक मान प्रकार है) स्लाइस के अंदर रहते हैं। इसके बजाय हम *MyStructस्लाइस के अंदर टाइप के पॉइंटर्स लगा सकते हैं । यदि आप इसे जिस तरह से काम करने के लिए इसकी आवश्यकता है, तो आप लौटाए गए मूल्यों के बजाय अनुक्रमित का उपयोग कर सकते हैं range
केव शाहबाज़

जवाबों:


126

संक्षिप्त और सीधा उत्तर: नहीं, मूल्य के बजाय सरणी सूचकांक का उपयोग करें

तो उपरोक्त कोड बन जाता है:

package main

import "fmt"

type MyType struct {
    field string
}

func main() {
    var array [10]MyType

    for idx, _ := range array {
        array[idx].field = "foo"
    }

    for _, e := range array {
        fmt.Println(e.field)
        fmt.Println("--")
    }
}

30
और निश्चित रूप से, अगर आप बार-बार का उपयोग array[idx]आप के बजाय करने के लिए चुन सकते हैं e := &array[idx]पाश के लिए के शीर्ष पर और उसके बाद का उपयोग e.field1, e.field2, आदि, जो और अधिक मिलता-जुलता ओ पी चाहता था हो सकता है (सिर्फ एक के बजाय दो पंक्तियों के साथ)।
डेव सी

18
आप , _पूरी तरह से छोड़ सकते हैं -for idx := range array
सैम टॉलीमैन

0

यह पहले से ही टिप्पणियों में कहा गया है, लेकिन अभी उत्तर की तलाश करने वालों के लिए, यहां बताया गया है कि आप पॉइंटर्स के एक स्लाइस का उपयोग करके और मूल कोड में कम से कम बदलाव करके कैसे अपेक्षित परिणाम प्राप्त कर सकते हैं।

package main

import "fmt"

type MyType struct {
    field string
}

func main() {
    // Slice of pointers instead of slice of type
    var array [10]*MyType

    // Initialize array manually
    for idx := range array {
        array[idx] = &MyType{}
    }

    for _, e := range array {
        e.field = "foo"
    }

    for _, e := range array {
        fmt.Println(e.field)
        fmt.Println("--")
    }

}

यहाँ यह खेल के मैदान में है


2
तथ्य यह है, कि सूचक केवल इस श्रेणी के उपयोग के लिए उपयोगी है। मैं e := &array[idx]हर उस सीमा के अंदर जोड़ना पसंद करूंगा , जिसमें उस पॉइंटर को एक पॉइंटर हो ...
Cirelli94

-1
package main

import "fmt"

type MyType struct {
    field string
}

func main() {
    var array [10]MyType

    for index := range array {
        array[index].field = "foo"
    }

    for _, e := range array {
        fmt.Println(e.field)
        fmt.Println("--")
    }
}

1
यह मौजूदा स्वीकृत उत्तर (6 साल पहले पोस्ट) में कुछ भी जोड़ने के लिए प्रतीत नहीं होता है।
ब्रिट्स
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.