Go এর বিপরীতে কোনও ফালি দিয়ে পুনরাবৃত্তি করার কোনও উপায় আছে?


98

এরকম কিছু বলতে সক্ষম হওয়া সুবিধাজনক হবে:

for _, element := reverse range mySlice {
        ...
}

উত্তর:


146

কোনও জায়গায় এই ব্যাপ্তিতে যোগ করার জন্য কোনও সুবিধাজনক অপারেটর নেই। লুপ গণনা করার জন্য আপনাকে একটি সাধারণ কাজ করতে হবে:

s := []int{5, 4, 3, 2, 1}
for i := len(s)-1; i >= 0; i-- {
   fmt.Println(s[i])
}

কার্যকর চলতে চলতে পৃষ্ঠা একটি উদাহরণ, কিন্তু এই এক আসলে একটি বিট সুন্দর হয় এবং কম ভেরিয়েবল ঘোষণা করে।
কেভিন ক্যান্টওয়েল

4
আইএমও গো মরিয়াতে একটি অবতরণী পরিসীমা নির্মাণ প্রয়োজন। এটি না হওয়ায় অতিরিক্ত কাজের ভাল কাজ করা যায়, যেমন আমরা দেখতে পাচ্ছি .... -
ভেক্টর

24
আমি মরিয়া হয়ে বলব না, এটি একটি সুন্দর হবে।
অ্যাডাম কুরকিউইকজ

47

আপনি এটি করতে পারেন:

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



6

কীভাবে ব্যবহার পিছিয়ে দিন:

s := []int{5, 4, 3, 2, 1}
for i, _ := range s {
   defer fmt.Println(s[i])
}

9
আমি এ বিষয়ে কিছুটা নতুন জ্ঞান এনেছি বলে সত্যই ভোট deferদিয়েছি তবে আমি বিশ্বাস করি যে এটি একটি লুপের অভ্যন্তরে বিপরীতভাবে ব্যবহার করা বেশ কৃপণ এবং স্মৃতি ভিত্তিক বেশ কার্যকর হওয়া উচিত।
আলেকজান্ডার ট্রখিমেনোক

11
এটি "কাজ করে" তবে লুপটি ফাংশনের শেষ জিনিস না হলে আপনি অপ্রত্যাশিত ফলাফল পেতে পারেন। উদাহরণ।
ড্যানিয়েল

6
এটি এমনভাবে ব্যবহার deferকরছে যা এটির উদ্দেশ্যে নয়। এটি ব্যবহার করবেন না কারণ এটিতে বাজে পার্শ্ব প্রতিক্রিয়া থাকতে পারে (অর্ডার কার্যকর হওয়ার বাইরে)। কেবল forগৃহীত উত্তরের লুপটি ব্যবহার করুন । গো এই ধরণের চতুর (নয়) হ্যাকগুলি হ্রাস করার লক্ষ্যে রয়েছে কারণ তারা আপনাকে পরে পাছায় কামড়ায়।
রিকিএ

6
এটি মুলতুবি একটি হ্যাক ব্যবহার এবং এড়ানো উচিত। এটি যদি উদাহরণস্বরূপ, এমন কোনও ফাংশন যা ভবিষ্যতে কেউ প্রসারিত করতে পারে তবে এর অযৌক্তিক পরিণতি হতে পারে।
আমির কেবি

6
এটি পুরোপুরি 'iffy' যথেষ্ট, তাই আমি এগিয়ে যান এবং ছিল না যোগ চ্যানেল play.golang.org/p/GodEiv1LlIJ
Xeoncross

4

চ্যানেলটি অনুলিপি না করে কোনও ফাংশনে তালিকার বিপরীতে ব্যবহার করতে পারে। এটি আমার অর্থে কোডটিকে আরও সুন্দর করে তোলে।

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ফাংশন কেবল স্ট্রিংগুলিকে সমর্থন করে।
Atmocreations

নিশ্চিতভাবেই, কেবল ইন্টারফেস string by দ্বারা স্ট্রিং প্রতিস্থাপন করুন এবং আপনি যেতে ভাল। আমি কেবল চাপ দিতে চাই যে স্বাক্ষরযুক্ত কোনও ফাংশন func reverse(lst []interface{}) chan inyterface{} কোনও [] স্ট্রিংটিকে আর ইনপুট হিসাবে গ্রহণ করবে না। এমনকি যদি ইন্টারফেস {string এ স্ট্রিং কাস্ট করা যায় তবে [] ইন্টারফেস {} এ স্ট্রিং কাস্ট করা যায় না} দুর্ভাগ্যক্রমে, বর্তমান বিপরীত ফাংশনটি সেই ধরণের ফাংশন যা অনেকটা আবার লিখতে হবে।
ব্যবহারকারী 983716

ধন্যবাদ. এটি আমার মনে হয় যা করার কুৎসিত অংশ - যা কোনওরকমে অনিবার্য। ধন্যবাদ!
Atmocreations

আমি এর পরিবর্তে একটি স্ট্যাক প্রয়োগ করব।
ri দেবরিম্বরীস

0

যখন আমাকে একটি স্লাইস এবং বিপরীত পরিসীমা থেকে উপাদানগুলি বের করতে হবে, আমি এই কোডের মতো কিছু ব্যবহার করি:

// 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

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.