এটি দেখতে কিছুটা অদ্ভুত তবে এখানে বেশিরভাগ উত্তরগুলি বিপদজনক এবং তারা আসলে কী করছে তা নিয়ে চকচকে। স্লাইস থেকে কোনও আইটেম সরানোর বিষয়ে জিজ্ঞাসা করা মূল প্রশ্নটির দিকে তাকিয়ে স্লাইসের একটি অনুলিপি তৈরি করা হচ্ছে এবং তারপরে এটি পূরণ করা হচ্ছে। এটি নিশ্চিত করে যে টুকরোগুলি আপনার প্রোগ্রামের চারপাশে পাস করার সাথে সাথে আপনি সূক্ষ্ম বাগগুলি প্রবর্তন করেন না।
এই থ্রেড এবং মূল পোস্টে ব্যবহারকারীদের উত্তরগুলির তুলনা করার জন্য এখানে কিছু কোড রয়েছে। এই কোডটি সহ চারদিকে গোলযোগের জন্য এখানে যাওয়ার খেলার মাঠ go
ভিত্তিক অপসারণ যোগ করুন
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)
}
মূল সরান সূচক সমাধানের সাথে প্রায় একই রকম তবে আমরা ফিরে আসার আগে যুক্ত করতে একটি নতুন স্লাইস তৈরি করি।