এরকম কিছু বলতে সক্ষম হওয়া সুবিধাজনক হবে:
for _, element := reverse range mySlice {
...
}
উত্তর:
কোনও জায়গায় এই ব্যাপ্তিতে যোগ করার জন্য কোনও সুবিধাজনক অপারেটর নেই। লুপ গণনা করার জন্য আপনাকে একটি সাধারণ কাজ করতে হবে:
s := []int{5, 4, 3, 2, 1}
for i := len(s)-1; i >= 0; i-- {
fmt.Println(s[i])
}
আপনি এটি করতে পারেন:
s := []int{5, 4, 3, 2, 1}
for i := range s {
fmt.Println(s[len(s)-1-i]) // Suggestion: do `last := len(s)-1` before the loop
}
আউটপুট:
1
2
3
4
5
এছাড়াও এখানে: http://play.golang.org/p/l7Z69TV7Vl
সূচকের সাথে বিভিন্নতা
for k := range s {
k = len(s) - 1 - k
// now k starts from the end
}
কীভাবে ব্যবহার পিছিয়ে দিন:
s := []int{5, 4, 3, 2, 1}
for i, _ := range s {
defer fmt.Println(s[i])
}
defer
দিয়েছি তবে আমি বিশ্বাস করি যে এটি একটি লুপের অভ্যন্তরে বিপরীতভাবে ব্যবহার করা বেশ কৃপণ এবং স্মৃতি ভিত্তিক বেশ কার্যকর হওয়া উচিত।
defer
করছে যা এটির উদ্দেশ্যে নয়। এটি ব্যবহার করবেন না কারণ এটিতে বাজে পার্শ্ব প্রতিক্রিয়া থাকতে পারে (অর্ডার কার্যকর হওয়ার বাইরে)। কেবল for
গৃহীত উত্তরের লুপটি ব্যবহার করুন । গো এই ধরণের চতুর (নয়) হ্যাকগুলি হ্রাস করার লক্ষ্যে রয়েছে কারণ তারা আপনাকে পরে পাছায় কামড়ায়।
চ্যানেলটি অনুলিপি না করে কোনও ফাংশনে তালিকার বিপরীতে ব্যবহার করতে পারে। এটি আমার অর্থে কোডটিকে আরও সুন্দর করে তোলে।
package main
import (
"fmt"
)
func reverse(lst []string) chan string {
ret := make(chan string)
go func() {
for i, _ := range lst {
ret <- lst[len(lst)-1-i]
}
close(ret)
}()
return ret
}
func main() {
elms := []string{"a", "b", "c", "d"}
for e := range reverse(elms) {
fmt.Println(e)
}
}
[]interface{}
? কারণ বর্তমান reverse
ফাংশন কেবল স্ট্রিংগুলিকে সমর্থন করে।
func reverse(lst []interface{}) chan inyterface{}
কোনও [] স্ট্রিংটিকে আর ইনপুট হিসাবে গ্রহণ করবে না। এমনকি যদি ইন্টারফেস {string এ স্ট্রিং কাস্ট করা যায় তবে [] ইন্টারফেস {} এ স্ট্রিং কাস্ট করা যায় না} দুর্ভাগ্যক্রমে, বর্তমান বিপরীত ফাংশনটি সেই ধরণের ফাংশন যা অনেকটা আবার লিখতে হবে।
যখন আমাকে একটি স্লাইস এবং বিপরীত পরিসীমা থেকে উপাদানগুলি বের করতে হবে, আমি এই কোডের মতো কিছু ব্যবহার করি:
// reverse range
// Go Playground: https://play.golang.org/p/gx6fJIfb7fo
package main
import (
"fmt"
)
type Elem struct {
Id int64
Name string
}
type Elems []Elem
func main() {
mySlice := Elems{{Id: 0, Name: "Alice"}, {Id: 1, Name: "Bob"}, {Id: 2, Name: "Carol"}}
for i, element := range mySlice {
fmt.Printf("Normal range: [%v] %+v\n", i, element)
}
//mySlice = Elems{}
//mySlice = Elems{{Id: 0, Name: "Alice"}}
if last := len(mySlice) - 1; last >= 0 {
for i, element := last, mySlice[0]; i >= 0; i-- {
element = mySlice[i]
fmt.Printf("Reverse range: [%v] %+v\n", i, element)
}
} else {
fmt.Println("mySlice empty")
}
}
আউটপুট:
Normal range: [0] {Id:0 Name:Alice}
Normal range: [1] {Id:1 Name:Bob}
Normal range: [2] {Id:2 Name:Carol}
Reverse range: [2] {Id:2 Name:Carol}
Reverse range: [1] {Id:1 Name:Bob}
Reverse range: [0] {Id:0 Name:Alice}
খেলার মাঠ: https://play.golang.org/p/gx6fJIfb7fo