পরিবর্তে মানগুলির ব্যাপ্তি উল্লেখ করে


90

আমি দেখেছি যে পরিসরটি মানটির কী এবং "অনুলিপি" প্রদান করে। আইটেমের ঠিকানাটি ফেরত দেওয়ার জন্য কি এই সীমার কোনও উপায় আছে? উদাহরণ

package main

import "fmt"

type MyType struct {
    field string
}

func main() {
    var array [10]MyType

    for _, e := range array {
        e.field = "foo"
    }

    for _, e := range array {
        fmt.Println(e.field)
        fmt.Println("--")
    }
}

http://play.golang.org/p/AFOGG9NGpx

এখানে "ক্ষেত্র" পরিবর্তন করা হয়নি কারণ পরিসীমা ক্ষেত্রের অনুলিপি প্রেরণ করে, আমাকে কি সূচক ব্যবহার করতে হবে বা মানটি সংশোধন করার জন্য অন্য কোনও উপায় আছে?

পড়ার জন্য ধন্যবাদ.



4
আপনি কি পয়েন্টারের অ্যারে ব্যবহার করতে পারেন MyType?
nvcnvn

হ্যাঁ, আপনি যদি পয়েন্টারের একটি অ্যারে ব্যবহার করেন তবে আপনি সূচকটি ব্যবহার না করেই অ্যারেতে সরাসরি ফলাফলগুলি সংশোধন করতে পারেন, এখানে একটি উদাহরণ রয়েছে play.golang.org/p/_Vx7ONLDJs
notzippy

rangeভাল কাজ করছে এবং আপনি স্লাইসের ভিতরে যা রেখেছেন তা ফিরে আসে। এখানে টাইপের মান MyStruct(যা একটি মান ধরণের) স্লাইসের অভ্যন্তরে থাকে। পরিবর্তে আমরা *MyStructস্লাইস ভিতরে টাইপ পয়েন্টার রাখতে পারে । যদি আপনার একেবারে ঠিক এটির মতো কাজ করার প্রয়োজন হয় তবে আপনি ফিরে আসা মানগুলির পরিবর্তে সূচকগুলি ব্যবহার করতে পারেন range
কাভে শাহবাজিয়ান

উত্তর:


123

সংক্ষিপ্ত এবং সরাসরি উত্তর: না, মানের পরিবর্তে অ্যারে সূচকটি ব্যবহার করুন

সুতরাং উপরের কোডটি হয়ে যায়:

package main

import "fmt"

type MyType struct {
    field string
}

func main() {
    var array [10]MyType

    for idx, _ := range array {
        array[idx].field = "foo"
    }

    for _, e := range array {
        fmt.Println(e.field)
        fmt.Println("--")
    }
}

30
এবং অবশ্যই, যদি আপনি বারবার অ্যাক্সেস করেন তবে array[idx]পরিবর্তে e := &array[idx]লুপের শীর্ষে থাকা এবং তারপরে ব্যবহার ইত্যাদির বিকল্প বেছে নিতে পারেন e.field1, e.field2যা ওপি আরও ঘনিষ্ঠভাবে সাদৃশ্যযুক্ত থাকতে পারে (একটির পরিবর্তে দুটি লাইন দিয়ে)।
ডেভ সি

16
আপনি , _পুরোপুরি ড্রপ করতে পারেন -for idx := range array
স্যাম টালিমন

0

এটি ইতিমধ্যে মন্তব্যে বলা হয়েছে, তবে এখনই উত্তরগুলির সন্ধানকারীদের জন্য, এখানে আপনি কীভাবে পয়েন্টারগুলির একটি স্লাইস ব্যবহার করে এবং মূল কোডটিতে নূন্যতম পরিবর্তন করে প্রত্যাশিত ফলাফল অর্জন করতে পারেন তা এখানে।

package main

import "fmt"

type MyType struct {
    field string
}

func main() {
    // Slice of pointers instead of slice of type
    var array [10]*MyType

    // Initialize array manually
    for idx := range array {
        array[idx] = &MyType{}
    }

    for _, e := range array {
        e.field = "foo"
    }

    for _, e := range array {
        fmt.Println(e.field)
        fmt.Println("--")
    }

}

এখানে এটি খেলার মাঠে আছে


4
আসল বিষয়টি হল, এই পয়েন্টারটি কেবলমাত্র এই ব্যাপ্তি ব্যবহারের জন্যই কার্যকর। আমি e := &array[idx]পয়েন্টারটিতে সেই পয়েন্টার থাকা প্রতিটি রেঞ্জের ভিতরে যুক্ত করতে পছন্দ করব ...
Cirelli94

-1
package main

import "fmt"

type MyType struct {
    field string
}

func main() {
    var array [10]MyType

    for index := range array {
        array[index].field = "foo"
    }

    for _, e := range array {
        fmt.Println(e.field)
        fmt.Println("--")
    }
}

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