যেতে যেতে মানচিত্র [কী] মুছবেন?


166

আমার একটি মানচিত্র রয়েছে:

var sessions =  map[string] chan int{}

আমি কীভাবে মুছব sessions[key]? আমি চেষ্টা করেছিলাম:

sessions[key] = nil,false;

কাজ হয়নি।


হালনাগাদ (নভেম্বর ২০১১):

মানচিত্রের এন্ট্রিগুলি মোছার জন্য বিশেষ সিনট্যাক্সটি গো সংস্করণ 1 এ সরানো হয়েছে :

Go 1 বিশেষ মানচিত্রের কার্যভারটি সরিয়ে ফেলবে এবং একটি নতুন অন্তর্নির্মিত ফাংশনটি প্রবর্তন করবে delete:: delete(m, x)এক্সপ্রেশন দ্বারা পুনরুদ্ধার করা মানচিত্রের এন্ট্রি মুছে ফেলবে m[x]। ...

উত্তর:


154

আশ্চর্যের ব্যাপার,

package main

func main () {
    var sessions = map[string] chan int{};
    delete(sessions, "moo");
}

কাজ মনে হচ্ছে। এটি যদিও সম্পদের দুর্বল ব্যবহার বলে মনে হচ্ছে!

অন্য উপায় হ'ল অস্তিত্ব পরীক্ষা করা এবং মানটি নিজেই ব্যবহার করা:

package main

func main () {
    var sessions = map[string] chan int{};
    sessions["moo"] = make (chan int);
    _, ok := sessions["moo"];
    if ok {
        delete(sessions, "moo");
    }
}

মানটির সন্ধান করা এবং এর পুনরায় ব্যবহার করা অবশ্যই সস্তা হবে: sessions["moo"] = sessions["moo"], false;(বা এটি ভুল?)
u0b34a0f6ae

কীটি উপস্থিত না থাকলে ক্রাশ হয়। আমি আপনার ধারণার ভিত্তিতে আরেকটি সমাধান যুক্ত করেছি।

1
মানচিত্রটি নিজেই রেঞ্জ করার সময় কি এটি ব্যবহার করা নিরাপদ?
হোর্হে রামিরেজ

পছন্দ করুন আপনি যদি সেটি করতে চান তবে মানচিত্রের অবজেক্টের পরিবর্তে কীগুলির
টুকরোটি

5
দ্বিতীয় সমাধানটি কেন সম্পদের আরও ভাল ব্যবহার? দ্বিতীয় সমাধানে আপনি দুটি কী লকআপ দেখেন, তবে প্রথম সমাধানে আপনি একটি কী অনুসন্ধান করেন।
thebiggestlebowski

86

গো 1 রিলিজ নোট থেকে অনুলিপি করা হয়েছে

পুরানো ভাষায়, kপ্রতিনিধিত্ব করা মানচিত্র থেকে কী সহ এন্ট্রি মুছতে m, একজন বিবৃতি লিখেছেন,

m[k] = value, false

এই বাক্য গঠনটি ছিল এক অদ্ভুত বিশেষ কেস, একমাত্র দু'একটি কার্য এর জন্য এমন একটি মান (সাধারণত উপেক্ষা করা) পাস করা দরকার যা মূল্যায়ন করা হয় তবে ফেলে দেওয়া হয়, এবং এমন একটি বুলিয়ান যা প্রায় সবসময় ধ্রুবক মিথ্যা ছিল। এটি কাজটি করেছে তবে বিজোড় এবং একটি বিতর্ক ছিল।

গো 1 তে, সেই বাক্য গঠনটি চলে গেছে; পরিবর্তে একটি নতুন অন্তর্নির্মিত ফাংশন আছে delete,। কল

delete(m, k)

অভিব্যক্তি দ্বারা পুনরুদ্ধার করা মানচিত্রের এন্ট্রি মুছবে m[k]। কোন রিটার্ন মান নেই। অস্তিত্বহীন এন্ট্রি মোছা একটি অপ-অপশন।

আপডেট করা হচ্ছে: চলমান go fixফর্মের এক্সপ্রেশন রূপান্তর করবে m[k] = value, falseমধ্যে delete(m, k)যখন এটা স্পষ্ট যে উপেক্ষিত মান নিরাপদে প্রোগ্রাম থেকে বাতিল করা যাবে এবং falseপূর্বনির্ধারিত বুলিয়ান ধ্রুবক বোঝায়। ফিক্স সরঞ্জাম প্রোগ্রামার দ্বারা পরিদর্শন করার জন্য সিনট্যাক্সের অন্যান্য ব্যবহারগুলিকে পতাকাঙ্কিত করবে।


54

কার্যকর গো থেকে :

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

delete(timeZone, "PDT")  // Now on Standard Time

sessions.go:6: cannot use 0 (type int) as type chan int

3
@ কিনোপিকো: আমি মনে করি না যে জুরিলি ওপি-র কোড স্নিপেট ব্যবহার করেছিল meant তিনি ডক্স থেকে সবেমাত্র একটি উদাহরণ অনুলিপি করেছেন।
যিশাইয়

2
দেখে মনে হচ্ছে এটি থেকে সরানো হয়েছে, পেয়ে assignment count mismatch: 1 = 2 (use delete)
যাচ্ছেন


0

make (chan int)পরিবর্তে ব্যবহার করুন nil। প্রথম মানটি একই ধরণের হতে হবে যা আপনার মানচিত্রটি ধারণ করে।

package main

import "fmt"

func main() {

    var sessions = map[string] chan int{}
    sessions["somekey"] = make(chan int)

    fmt.Printf ("%d\n", len(sessions)) // 1

    // Remove somekey's value from sessions
    delete(sessions, "somekey")

    fmt.Printf ("%d\n", len(sessions)) // 0
}

আপডেট: আমার উত্তর সংশোধন করে।


sessions.go:6: cannot use 0 (type int) as type chan int

ওফস, ভুলে গিয়েছি যে আমি
যিশাইয়

package main func main () {var sessions = map[string] chan int{};sessions["moo"] = make (chan int);}

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