मैं सिर्फ एक ऐसा फ़ंक्शन चाहता हूं जिसमें एक स्ट्रक्चर प्रकार "टी" का टुकड़ा हो, वह तत्व लौटाता है जिसे मैं ढूंढ रहा हूं और शेष, मैंने अपनी समस्या के आंशिक समाधान के साथ प्रयास किया जैसे कि यहां बताया गया है: एक स्लाइस में एलीमेंट हटाएं लेकिन एक अजीब कारण से, यह अपेक्षा के अनुरूप काम नहीं करता https://play.golang.org/p/tvJwkF5c_tj

    func main() {
    var names = []string{"john", "julio", "pepito","carlos"}
    fmt.Println(getMe("john", names))
}
func getMe(me string, names []string) (string, []string, bool) {
    for i := range names {
        if names[i] == me {
            return names[i], append(names[:i], names[i+1:]...), true
        }
    }
    return "", nil, false
}

लेकिन परिणाम मुझे देता है:

julio [julio pepito carlos] true

अपडेट करें: https://play.golang.org/p/1xbu01rOiMg @Ullakut . से जवाब लेते हुए अगर मैं करता हूं: append(names[:i], names[i+1:]...), यह मूल टुकड़ा बदल देता है, इसलिए यह मेरे लिए काम नहीं करता है, मैं नहीं चाहता कि मेरा टुकड़ा बदल जाए, क्योंकि मैं इसे बाद में उपयोग करूँगा

go
1
John Balvin Arias 12 सितंबर 2018, 00:22

1 उत्तर

सबसे बढ़िया उत्तर

इंडेक्स का उपयोग करके मूल्य तक पहुंचने के बजाय, मूल्य और अनुक्रमणिका दोनों प्राप्त करने के लिए बस सीमा का उपयोग करें।

package main

import (
    "fmt"
)

func main() {
    var names = []string{"john", "julio", "pepito", "carlos"}
    name, newNames, _ := getMe("john", names)

    fmt.Println("extracted name:\t\t\t\t", name)
    fmt.Println("new slice without extracted name:\t", newNames)
    fmt.Println("old slice still intact:\t\t\t", names)
}

func getMe(me string, names []string) (string, []string, bool) {
    var newSlice []string

    for i := 0; i < len(names); i++ {
        if names[i] == me {
            newSlice = append(newSlice, names[:i]...)
            newSlice = append(newSlice, names[i+1:]...)
            return names[i], newSlice, true
        }
    }

    return "", nil, false
}

आउटपुट

extracted name:                        john
new slice without extracted name:      [julio pepito carlos]
old slice still intact:                [john julio pepito carlos]

देखें खेल के मैदान का उदाहरण

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

2
Ullaakut 12 सितंबर 2018, 23:20