মানচিত্রে বা গো রেফারেন্সের মাধ্যমে ম্যাপগুলি পাস করা আছে?


94

মানচিত্রে মান বা রেফারেন্স দিয়ে যেতে হবে?

নিম্নলিখিত হিসাবে কোনও ক্রিয়াকে সংজ্ঞায়িত করা সর্বদা সম্ভব, তবে এটি কি ওভারকিল?

func foo(dat *map[string]interface{}) {...}

ফেরতের মানের জন্য একই প্রশ্ন। আমি কি মানচিত্রে একটি পয়েন্টার ফিরিয়ে দেব, বা মান হিসাবে মানচিত্রটি ফিরিয়ে দেব?

উদ্দেশ্য অবশ্যই অপ্রয়োজনীয় ডেটা অনুলিপি এড়ানোর জন্য।


4
blog.golang.org/go-maps-in-action : মানচিত্রের ধরণগুলি রেফারেন্স ধরণের, পয়েন্টার বা স্লাইসের মতো এবং তাই উপরের মিটার মানটি শূন্য; এটি কোনও প্রাথমিক মানচিত্রে নির্দেশ করে না। একটি শূন্য মানচিত্র পড়ার সময় একটি খালি মানচিত্রের মতো আচরণ করে, কিন্তু শূন্য মানচিত্রে লেখার চেষ্টা করলে রানটাইম আতঙ্ক দেখা দেয়; এটা করবেন না। একটি মানচিত্র আরম্ভ করার জন্য, বিল্ট ইন মেক ফাংশনটি ব্যবহার করুন
এমএইচ-সিবিউন

4
গোতে সমস্ত কিছু মান দিয়ে যায়। কিছু মান পয়েন্টার বা স্ট্রাকচারে ঘটে যা পয়েন্টার ধারণ করে। (আপনি *mapযদি কোনও ঠিকানায় মানচিত্রের মূল্য পুনরায় জমা দিতে চান তবে আপনি কিছু ক্ষেত্রে এটি চাইতে পারেন)
জিমবি

এমএইচ-কিউন, গো-তে কোনও রেফারেন্স টাইপ নেই।
Inanc Gumus

@ mh-cbon আমি কোনও রেফারেন্স টাইপের কথা বলছিলাম না। আমি জিজ্ঞাসা করছিলাম কোন মানচিত্র রেফারেন্স দিয়ে পাস হয়েছে কিনা , যা জিজ্ঞাসার সমতুল্য কিনা মানচিত্রের ঠিকানাটি আর্গুমেন্ট হিসাবে দেওয়া হয়েছে বা মানচিত্রের একটি "অনুলিপি" (মান দিয়ে পাস হয়েছে)?
chmike

4
@ এমএইচ-সিউন ঠিক আছে, মানচিত্রগুলি এইচএমএপ-এর পয়েন্টার।
Inanc Gumus

উত্তর:


83

এই থ্রেড এ আপনি আপনার উত্তর পাবেন:

গোলং: একটি মানচিত্রের রেফারেন্স ব্যবহার করে অ্যাক্সেস করা

আপনাকে মানচিত্র সহ কোনও পয়েন্টার ব্যবহার করার দরকার নেই।

মানচিত্রের ধরণগুলি রেফারেন্সের ধরণগুলি যেমন পয়েন্টার বা স্লাইস [1]

আপনার যদি সেশনটি পরিবর্তন করতে হয় তবে আপনি একটি পয়েন্টার ব্যবহার করতে পারেন:

map[string]*Session

https://blog.golang.org/go-maps-in-action


16
কোনও পিটফাল এড়ানোর জন্য, সচেতন থাকুন যে মানচিত্রগুলি একবার একবার সূচনা করার পরে রেফারেন্স দ্বারা পাস করা হয় , এবং যখন কোনও ফাংশনের অভ্যন্তরে পুনরায় সূচনা হয়, মূল রেফারেন্সটি আপডেট হবে না। এখানে একটি চিত্রের খেলার মাঠের উদাহরণ: play.golang.org/p/Q6vrAmmJWR6 বা ডেভ চেনি এর
সিন্ড্রে মাইরেন

19

এখান থেকে কিছু অংশ এখানে দেওয়া আছে যদি মানচিত্রটি কোনও রেফারেন্স ভেরিয়েবল না হয় তবে এটি কী? লিখেছেন ডেভ চেনি:

মানচিত্রের মান হ'ল runtime.hmapকাঠামোর নির্দেশক।

এবং উপসংহার:

উপসংহার

চ্যানেলের মতো মানচিত্র, তবে স্লাইসগুলির মতো নয়, রানটাইম ধরণের জন্য কেবল পয়েন্টার। আপনি উপরে যেমন দেখেছেন, একটি মানচিত্র একটি runtime.hmap কাঠামোর কেবল পয়েন্টার ।

গো প্রোগ্রামে অন্য কোনও পয়েন্টার মানের মতো মানচিত্রের একই পয়েন্টার শব্দার্থক রয়েছে। সংস্থাপক দ্বারা মানক সিনট্যাক্সের পুনরায় লেখার কাজগুলিতে কলগুলিতে কোনও জাদু নেই runtime/hmap.go

এবং ইতিহাস / mapসিনট্যাক্সের ব্যাখ্যা সম্পর্কে একটি আকর্ষণীয় বিট :

মানচিত্র যদি পয়েন্টার হয় তবে সেগুলি হওয়া উচিত নয় *map[key]value?

এটি একটি ভাল প্রশ্ন যে মানচিত্রগুলি যদি পয়েন্টার মান হয় তবে কেন অভিব্যক্তিটি make(map[int]int)প্রকারের সাথে মান দেয় map[int]int। এটি কি ফিরে আসবে না *map[int]int? ইয়ান টেলর সম্প্রতি গোলং-বাদাম থ্রেড 1 এ এর ​​উত্তর দিয়েছেন

খুব প্রথম দিনগুলিতে আমরা এখন যা মানচিত্র বলি সেগুলি পয়েন্টার হিসাবে লেখা হয়েছিল, সুতরাং আপনি লিখেছিলেন *map[int]int। আমরা সেখান থেকে সরে এসেছি যখন আমরা বুঝতে পারি যে লেখা mapছাড়া কেউ কখনও লেখেন না *map

তর্কসাপেক্ষ থেকে টাইপ পুনঃনামকরনের *map[int]intকরার map[int]int, যখন বিভ্রান্তিকর ধরনের একটি পয়েন্টার মত দেখাচ্ছে না কারণ, একটি পয়েন্টার আকৃতির মান যা dereferenced করা যাবে না চেয়ে বিভ্রান্তিকর কম ছিল।


3

না। মানচিত্রগুলি ডিফল্ট হিসাবে উল্লেখ করা হয়।

    package main

    import "fmt"

    func mapToAnotherFunction(m map[string]int) {
        m["hello"] = 3
        m["world"] = 4
        m["new_word"] = 5
    }

    // func mapToAnotherFunctionAsRef(m *map[string]int) {
    // m["hello"] = 30
    // m["world"] = 40
    // m["2ndFunction"] = 5
    // }

    func main() {
        m := make(map[string]int)
        m["hello"] = 1
        m["world"] = 2

        // Initial State
        for key, val := range m {
            fmt.Println(key, "=>", val)
        }

        fmt.Println("-----------------------")

        mapToAnotherFunction(m)
        // After Passing to the function as a pointer
        for key, val := range m {
            fmt.Println(key, "=>", val)
        }

        // Try Un Commenting This Line
        fmt.Println("-----------------------")

        // mapToAnotherFunctionAsRef(&m)
        // // After Passing to the function as a pointer
        // for key, val := range m {
        //  fmt.Println(key, "=>", val)
        // }

        // Outputs
        // hello => 1
        // world => 2
        // -----------------------
        // hello => 3
        // world => 4
        // new_word => 5
        // -----------------------

    }

গোলং ব্লগ থেকে-

মানচিত্রের প্রকারগুলি হ'ল রেফারেন্স ধরণের, যেমন পয়েন্টার বা স্লাইস, এবং তাই উপরের মিটার মানটি শূন্য; এটি কোনও প্রাথমিক মানচিত্রে নির্দেশ করে না। একটি শূন্য মানচিত্র পড়ার সময় একটি খালি মানচিত্রের মতো আচরণ করে, তবে শূন্য মানচিত্রে লেখার চেষ্টা করলে রানটাইম আতঙ্ক দেখা দেয়; এটা করবেন না। একটি মানচিত্র আরম্ভ করার জন্য, বিল্ট ইন মেক ফাংশনটি ব্যবহার করুন:

// Ex of make function
m = make(map[string]int)

কোড স্নিপেট লিঙ্ক এটি দিয়ে খেলুন।

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