यह देखने में थोड़ा अजीब है लेकिन यहां ज्यादातर जवाब खतरनाक हैं और वास्तव में वे क्या कर रहे हैं, इस पर ग्लॉस। उस मूल प्रश्न को देखते हुए, जिसमें किसी वस्तु को स्लाइस से हटाने के बारे में पूछा गया था कि स्लाइस की एक प्रति बनाई जा रही है और फिर उसे भरा जा रहा है। यह सुनिश्चित करता है कि जैसे ही स्लाइस आपके कार्यक्रम के आसपास से गुजरेगा, आप सूक्ष्म बग का परिचय नहीं देंगे।
इस धागे और मूल पोस्ट में उपयोगकर्ताओं के उत्तरों की तुलना करने वाला कुछ कोड यहां दिया गया है। यहाँ इस कोड के साथ गड़बड़ करने के लिए एक खेल का मैदान है।
अपडेशन बेस्ड रिमूवल
package main
import (
"fmt"
)
func RemoveIndex(s []int, index int) []int {
return append(s[:index], s[index+1:]...)
}
func main() {
all := []int{0, 1, 2, 3, 4, 5, 6, 7, 8, 9}
fmt.Println("all: ", all)
removeIndex := RemoveIndex(all, 5)
fmt.Println("all: ", all)
fmt.Println("removeIndex: ", removeIndex)
removeIndex[0] = 999
fmt.Println("all: ", all)
fmt.Println("removeIndex: ", removeIndex)
}
उपरोक्त उदाहरण में आप मुझे एक स्लाइस बना सकते हैं और इसे मैन्युअल रूप से संख्या 0 से 9. तक भर सकते हैं। फिर हम सभी से इंडेक्स 5 हटाते हैं और इसे इंडेक्स निकालने के लिए असाइन करते हैं। हालाँकि जब हम सभी का प्रिंट आउट लेते हैं तो हम देखते हैं कि इसे संशोधित किया गया है। ऐसा इसलिए है क्योंकि स्लाइस एक अंतर्निहित सरणी के संकेत हैं। इसे लिखने के removeIndexकारणों allको संशोधित करने के साथ-साथ अंतर allएक तत्व से अधिक लंबा है जो अब उपलब्ध नहीं है removeIndex। आगे हम एक मान बदलते हैं removeIndexऔर हम allसंशोधित रूप में अच्छी तरह से देख सकते हैं । प्रभावी इस पर कुछ और विस्तार में जाता है।
निम्नलिखित उदाहरण मैं नहीं जाऊँगा, लेकिन यह हमारे उद्देश्यों के लिए एक ही काम करता है। और सिर्फ यह दर्शाता है कि कॉपी का उपयोग करना अलग नहीं है।
package main
import (
"fmt"
)
func RemoveCopy(slice []int, i int) []int {
copy(slice[i:], slice[i+1:])
return slice[:len(slice)-1]
}
func main() {
all := []int{0, 1, 2, 3, 4, 5, 6, 7, 8, 9}
fmt.Println("all: ", all)
removeCopy := RemoveCopy(all, 5)
fmt.Println("all: ", all)
fmt.Println("removeCopy: ", removeCopy)
removeCopy[0] = 999
fmt.Println("all: ", all)
fmt.Println("removeCopy: ", removeCopy)
}
सवाल मूल जवाब
मूल प्रश्न को देखते हुए यह उस स्लाइस को संशोधित नहीं करता है जो किसी आइटम को हटा रही है। इस पृष्ठ में आने वाले अधिकांश लोगों के लिए इस सूत्र में मूल उत्तर को सर्वश्रेष्ठ बनाना।
package main
import (
"fmt"
)
func OriginalRemoveIndex(arr []int, pos int) []int {
new_arr := make([]int, (len(arr) - 1))
k := 0
for i := 0; i < (len(arr) - 1); {
if i != pos {
new_arr[i] = arr[k]
k++
} else {
k++
}
i++
}
return new_arr
}
func main() {
all := []int{0, 1, 2, 3, 4, 5, 6, 7, 8, 9}
fmt.Println("all: ", all)
originalRemove := OriginalRemoveIndex(all, 5)
fmt.Println("all: ", all)
fmt.Println("originalRemove: ", originalRemove)
originalRemove[0] = 999
fmt.Println("all: ", all)
fmt.Println("originalRemove: ", originalRemove)
}
जैसा कि आप देख सकते हैं कि यह आउटपुट कार्य करता है क्योंकि अधिकांश लोग अपेक्षा करते हैं और संभावना है कि अधिकांश लोग क्या चाहते हैं। संशोधन में originalRemoveपरिवर्तन का कारण नहीं है allऔर सूचकांक को हटाने और इसे असाइन करने के संचालन में परिवर्तन नहीं होता है! बहुत खुबस!
यह कोड थोड़ा लंबा है, हालांकि इसके बाद के संस्करण को इसमें बदला जा सकता है।
एक सही जवाब
package main
import (
"fmt"
)
func RemoveIndex(s []int, index int) []int {
ret := make([]int, 0)
ret = append(ret, s[:index]...)
return append(ret, s[index+1:]...)
}
func main() {
all := []int{0, 1, 2, 3, 4, 5, 6, 7, 8, 9}
fmt.Println("all: ", all)
removeIndex := RemoveIndex(all, 5)
fmt.Println("all: ", all)
fmt.Println("removeIndex: ", removeIndex)
removeIndex[0] = 999
fmt.Println("all: ", all)
fmt.Println("removeIndex: ", removeIndex)
}
लगभग मूल हटाने सूचकांक समाधान के समान है लेकिन हम लौटने से पहले संलग्न करने के लिए एक नया टुकड़ा बनाते हैं।