গো-এ কি ফোরচ লুপ আছে?


565

foreachগো ভাষায় কোনও নির্মাণ রয়েছে? আমি একটি ব্যবহার করে একটি স্লাইস বা অ্যারের মাধ্যমে পুনরাবৃত্তি করতে পারি for?



1
ব্যবহারের rangeমধ্যে forলুপ এছাড়াও "একটি সেলা সম্পর্কে ধরন" উল্লেখ করা হয় যান টিউটোরিয়ালের অধ্যায় (এর শেষ দিকে)।
kostix

উত্তর:


850

https://golang.org/ref/spec#For_range

একটি অ্যারে, স্লাইস, স্ট্রিং বা মানচিত্রের সমস্ত এন্ট্রি বা কোনও চ্যানেলে প্রাপ্ত মানগুলির মাধ্যমে "রেঞ্জ" ধারা সহ একটি "স্টেটমেন্ট" পুনরাবৃত্তি করে। প্রতিটি প্রবেশের জন্য এটি পুনরাবৃত্ত মানগুলিকে সংশ্লিষ্ট পুনরাবৃত্তকরণ ভেরিয়েবলগুলিতে নির্ধারণ করে এবং তারপরে ব্লকটি কার্যকর করে।

উদাহরণ হিসাবে:

for index, element := range someSlice {
    // index is the index where we are
    // element is the element from someSlice for where we are
}

আপনি যদি সূচকের বিষয়ে চিন্তা না করেন তবে আপনি ব্যবহার করতে পারেন _:

for _, element := range someSlice {
    // element is the element from someSlice for where we are
}

আন্ডারস্কোরটি _হ'ল ফাঁকা শনাক্তকারী , একজন বেনামে স্থানধারক।


7
এই উদাহরণে, elementহয় মান উপাদান (একটি কপি) এর - এটি উপাদান নিজেই নয়। যদিও আপনি নির্ধারিত করতে পারেন element, এটি অন্তর্নিহিত ক্রমকে প্রভাবিত করবে না।
নোবার

আমি পাইথন এবং সি তে জানি এটি স্থানীয়করণের জন্য একটি কাজ হিসাবে আন্ডারস্কোর ব্যবহার করা (যেমন গেটেক্সটেক্স ) প্রায়শই ঘন ঘন । আন্ডারস্কোর ব্যবহারের ফলে কি কোনও সমস্যা হতে পারে? এমনকি স্থানীয়করণের জন্য কি একই লাইব্রেরিটি ব্যবহার করেন?
সের্গেই কোলোডিয়াযনি

2
@ সের্গিক্লোডিয়াজনি পাই ডকস বলেছেন যে "(গেটেক্সট) ফাংশনটি সাধারণত _()স্থানীয় নেমস্পেসের মতোই আলাদা করা হয়" যা কেবল কনভেনশন অনুসারে , এটি স্থানীয়করণ লাইবের অংশ নয়। আন্ডারস্কোরটি _একটি বৈধ লেবেল, এবং এটি _আপনি ব্যবহার করবেন না এমন ফেরতের মানগুলির জন্য নির্ধারিত গো (এবং পাইথন এবং স্কালা এবং অন্যান্য ল্যাঙ্গস) এও কনভেনশন । _এই উদাহরণে স্কোপটি forলুপের শরীরে সীমাবদ্ধ । আপনার যদি প্যাকেজ-স্কোপড ফাংশন থাকে _তবে এটি ফর লুপের স্কোপের মধ্যে ছায়াযুক্ত হবে। স্থানীয়করণের জন্য কয়েকটি প্যাকেজ রয়েছে, আমি কোনও _ফাংশন নাম হিসাবে কোনও ব্যবহার দেখিনি ।
দাভোস

149

foreachগোতে একটি মত সিনট্যাক্স রয়েছে। এটি অ্যারে / স্লাইস, মানচিত্র এবং চ্যানেলগুলি সমর্থন করে।

অ্যারে বা স্লাইস উপর Iterate :

// index and value
for i, v := range slice {}

// index only
for i := range slice {}

// value only
for _, v := range slice {}

একটি মানচিত্রে Iterate :

// key and value
for key, value := range theMap {}

// key only
for key := range theMap {}

// value only
for _, value := range theMap {}

একটি চ্যানেলের মাধ্যমে পরিবেশন করুন :

for v := range theChan {}

কোনও চ্যানেলকে পর্যালোচনা করা চ্যানেলটি বন্ধ না হওয়া অবধি প্রাপ্তির সমতুল্য:

for {
    v, ok := <-theChan
    if !ok {
        break
    }
}

10
যদিও ওপি কেবল স্লাইস ব্যবহারের জন্য বলেছিল, আমি এই উত্তরটি পছন্দ করি কারণ শেষ পর্যন্ত বেশিরভাগ ক্ষেত্রে অন্যান্য ব্যবহারগুলিও প্রয়োজন হবে।
ডোমারিগেটো

3
chanব্যবহার সম্পর্কে গুরুত্বপূর্ণ পার্থক্য : কোনও চ্যানেল জুড়ে যদি লেখক কোনও পর্যায়ে চ্যানেলটি বন্ধ করে দেয় তবে মনোযোগ দিয়ে লুপটি প্রস্থান করবে। ইন for {v := <-theChan} সমতুল্য , এটা হবে না চ্যানেল ঘনিষ্ঠ উপর থেকে প্রস্থান করুন। দ্বিতীয় okরিটার্ন মানের মাধ্যমে আপনি এটি পরীক্ষা করতে পারেন। টুর উদাহরণ
colm.anseo

এটি পড়ার সময় একই ভেবেছিলেন, এটি for { ... }অসীম লুপের জন্য দাঁড়িয়ে।
লেবীয়

13

নিম্নলিখিত উদাহরণটি দেখায় যে কীভাবে rangeএকটি forলুপ প্রয়োগ করতে অপারেটরটিকে একটি লুপে ব্যবহার করতে হয় foreach

func PrintXml (out io.Writer, value interface{}) error {
    var data []byte
    var err error

    for _, action := range []func() {
        func () { data, err = xml.MarshalIndent(value, "", "  ") },
        func () { _, err = out.Write([]byte(xml.Header)) },
        func () { _, err = out.Write(data) },
        func () { _, err = out.Write([]byte("\n")) }} {
        action();
        if err != nil {
            return err
        }
    }
    return nil;
}

উদাহরণস্বরূপ ফাংশনগুলির জন্য ত্রুটি পরিচালনার ক্ষেত্রে একীকরণের জন্য ক্রিয়াগুলির একটি অ্যারের উপরে পুনরাবৃত্তি হয়। একটি সম্পূর্ণ উদাহরণ গুগলের খেলার মাঠে

পিএস: এটিও দেখায় যে হ্যাং ব্রেসগুলি কোডের পাঠযোগ্যতার জন্য একটি খারাপ ধারণা are ইঙ্গিত: forশর্তটি action()কল করার ঠিক আগেই শেষ হয় । স্পষ্টত, তাই না?


3
একটি যুক্ত করুন ,এবং এটি স্পষ্ট যেখানে forশর্তটি শেষ হয়: play.golang.org/p/pcRg6WdxBd - এই প্রথম go fmtশৈলীতে একটি পাল্টা যুক্তি খুঁজে পেয়েছি , ধন্যবাদ!
9:30 এ টপস্কিপ

@ টপস্কিপ উভয়ই এফএমটি বৈধ; কেবল
সেরাটি

@ ফিলিপ হাগলুন্ড এটি বৈধ হলে এটি বিন্দু নয়। মুল বক্তব্যটি হ'ল আইএমও এটি পরিষ্কার হয় যেখানে উপরের নির্দিষ্ট ক্ষেত্রে শর্তটি শেষ হয়।
টপস্কিপ

8
আমার মতে, এই উত্তরটি লক্ষ্যযুক্ত প্রশ্নের জন্য অযৌক্তিক জটিল is
AndreasHassing

@ AndreasHassing অপ্রয়োজনীয়তার পরিচয় না দিয়ে কীভাবে এটি করা যায়?

10

আপনি প্রকৃতপক্ষে rangeএর for rangeপ্রকারের বিরুদ্ধে ব্যবহার করে এর রিটার্ন মানগুলি উল্লেখ না করে ব্যবহার করতে পারেন :

arr := make([]uint8, 5)
i,j := 0,0
for range arr {
    fmt.Println("Array Loop",i)
    i++
}

for range "bytes" {
    fmt.Println("String Loop",j)
    j++
}

https://play.golang.org/p/XHrHLbJMEd


3
জেনে রাখা ভাল তবে এটি বেশিরভাগ ক্ষেত্রে কার্যকর হতে পারে না
শ্রীধর

@ শ্রীধর সম্মত হলেন এটি বেশ কুলুঙ্গি।
রবস্টারবাক

9

গোলাংয়ে কীভাবে ফোরচ ব্যবহার করবেন তার উদাহরণ কোড নীচে দেওয়া হল

package main

import (
    "fmt"
)

func main() {

    arrayOne := [3]string{"Apple", "Mango", "Banana"}

    for index,element := range arrayOne{

        fmt.Println(index)
        fmt.Println(element)        

    }   

}

এটি একটি চলমান উদাহরণ https://play.golang.org/p/LXptmH4X_0


খুব ভাল ব্যাখ্যা!
ডার্লান ডিয়েটারিচ

4

হ্যাঁ, ব্যাপ্তি :

লুপের রেঞ্জের ফর্মটি একটি স্লাইস বা মানচিত্রের উপরে পুনরাবৃত্তি করে।

একটি স্লাইস উপরের যখন, প্রতিটি পুনরাবৃত্তির জন্য দুটি মান প্রদান করা হয়। প্রথমটি সূচক এবং দ্বিতীয়টি সেই সূচকের উপাদানটির অনুলিপি।

উদাহরণ:

package main

import "fmt"

var pow = []int{1, 2, 4, 8, 16, 32, 64, 128}

func main() {
    for i, v := range pow {
        fmt.Printf("2**%d = %d\n", i, v)
    }

    for i := range pow {
        pow[i] = 1 << uint(i) // == 2**i
    }
    for _, value := range pow {
        fmt.Printf("%d\n", value)
    }
}
  • আপনি _ কে নির্ধারিত করে সূচক বা মানটি এড়িয়ে যেতে পারেন।
  • আপনি যদি কেবল সূচক চান তবে পুরোপুরি মানটি বাদ দিন।

1

এটি সুস্পষ্ট হতে পারে তবে আপনি অ্যারের মতো করেও ইনলাইন করতে পারেন:

package main

import (
    "fmt"
)

func main() {
    for _, element := range [3]string{"a", "b", "c"} {
        fmt.Print(element)
    }
}

আউটপুট:

abc

https://play.golang.org/p/gkKgF3y5nmt

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