দুটি স্লাইসের সমতা পরীক্ষা করা হচ্ছে


274

দুটি টুকরা সমান কিনা তা আমি কীভাবে পরীক্ষা করতে পারি?


111
প্রশ্নটি আসলে একটি সাধারণ কাজ সম্পর্কে, তবে আইএমও এটি একটি আসল প্রশ্ন, খুব নির্দিষ্ট উত্তর সহ। এটি "সত্যিকারের প্রশ্ন নয়" হিসাবে কীভাবে বন্ধ করা যেতে পারে, যতদূর আমি দেখতে পাচ্ছি, যে লোকেরা আমি ট্যাগ হওয়া প্রশ্নগুলিতে চিরকাল সক্রিয় থাকাকে স্মরণ করতে পারি না, সেগুলি আমার বাইরে। বিশেষত: প্রশ্নটি দ্ব্যর্থহীন, সম্পূর্ণ, একক (সরল হলেও) সমস্যার সংকীর্ণ, অলঙ্কারহীন এবং এর বর্তমান আকারে যথাযথভাবে এবং সঠিকভাবে উত্তর দেওয়া যেতে পারে। ==অপারেটর শুধুমাত্র কিছু ধরনের জন্য যান সংজ্ঞায়িত করা হয়, তাই পরন্তু, এই প্রশ্নের একটি বৈধ অন্যতম।
zzzz

4
তবুও, এটি নিকট কারণে উল্লিখিত কোনও কিছুই নয় ("বর্তমানের আকারে যুক্তিসঙ্গত উত্তর দেওয়া যায় না")।
ধনী চুর্চার

9
হাহাহা, আমি বিশ্বাস করতে পারি না এটি "বাস্তব প্রশ্ন নয়" এর জন্য বন্ধ হয়ে গেছে। 1) কী জিজ্ঞাসা করা হচ্ছে তা বলা মুশকিল নয়। 2) প্রশ্নটি অস্পষ্ট / অসম্পূর্ণ / প্রশস্ত / অযৌক্তিক নয়। এটি বেশ গালাগালি!
weberc2

5
দেখে মনে হচ্ছে এটি ডাউনভোট বোতামটি ভুল করার পক্ষে খুব সহজ উপায় ("আমি মনে করি এই প্রশ্নটি চেষ্টা দেখায় না এবং ভাল জিজ্ঞাসা করা হয়নি") ক্লোজ বাটনটি দিয়ে ("আমি মনে করি এটি নিম্নলিখিত কারণগুলির কারণে উত্তর দেওয়া যায় না ..) । ")। হতে পারে কারণ নিকটতম ভোট বিনামূল্যে।
কোস

3
গো-তে বিকাশ ঘটেছে এবং এর বিপরীতে দৌড়েছে slice can only be compared to nil, এবং ভাবছিলাম যে স্লাইস সাম্যতা যাচাই করার জন্য কোনও মূর্তিমানিক গোলং উপায় আছে ... যদি সাম্যতা অপারেটরটি ভাষা দ্বারা সংজ্ঞায়িত না হয়, তবে আমি সবচেয়ে কার্যকরী উপায় জিজ্ঞাসা করা যুক্তিসঙ্গত মনে করি এটি সম্পাদন করতে। প্রশ্নটি বন্ধ করার দরকার ছিল না
অ্যাগর্ডন

উত্তর:


157

আপনি স্লাইস এবং পরীক্ষার প্রতিটি উপাদানকে লুপ করতে হবে। টুকরো জন্য সমতা সংজ্ঞায়িত করা হয় না। যাইহোক, bytes.Equalযদি আপনি টাইপের মানগুলির তুলনা করে থাকেন তবে একটি ফাংশন রয়েছে []byte

func testEq(a, b []Type) bool {

    // If one is nil, the other must also be nil.
    if (a == nil) != (b == nil) { 
        return false; 
    }

    if len(a) != len(b) {
        return false
    }

    for i := range a {
        if a[i] != b[i] {
            return false
        }
    }

    return true
}

15
প্রস্তাবনা: for i, v := range a { if v != b[i] { return false } }
zzzz

19
@ জিজেজ সাবধান, এটি বিভিন্ন দৈর্ঘ্যে ব্যর্থ হবে।
ফিলোসটাইল

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

5
কোনও ভাষা যেমন একেবারে প্রয়োজনীয় না হলে প্রতিচ্ছবিটি ব্যবহার না করার পরামর্শ দেয় Go হ্যাঁ, এটি প্রতিটি ধরণের জন্য করা দরকার তবে এটি সাধারণত আপনি যেভাবেই করেন না এমন কিছু নয়। এছাড়াও, প্রতিফলিত করুন। ডিপইকুয়াল এমন কিছু করতে পারে যা আপনি প্রত্যাশা করেন না যেমন দুটি পৃথক পয়েন্টার সমান বলে বলা হয় কারণ তারা যে মানগুলি দেখায় সেগুলি সমান।
স্টিফেন ওয়েইনবার্গ

2
@ ফিলোসটাইল দৈর্ঘ্য আগেই পরীক্ষা করা হয়, দৈর্ঘ্য পৃথক হলে লুপটি পৌঁছে যাবে।
আইজজা

259

আপনার প্রতিবিম্ব ব্যবহার করা উচিত eep

ডিপক্যুয়াল হল গো এর == অপারেটরের পুনরাবৃত্তিমূলক শিথিলকরণ।

ডিপ ইক্যুয়াল x এবং y "গভীর সমান," নীচে সংজ্ঞায়িত হয়েছে কিনা তা রিপোর্ট করে। অভিন্ন ধরণের দুটি মান গভীরভাবে সমান হয় যদি নিম্নলিখিতগুলির মধ্যে একটির ক্ষেত্রে প্রয়োগ হয়। স্বতন্ত্র ধরণের মানগুলি গভীরভাবে সমান হয় না।

অ্যারে মানগুলি গভীরভাবে সমান হয় যখন তাদের সম্পর্কিত উপাদানগুলি গভীরভাবে সমান হয়।

স্ট্রাক্ট মানগুলি গভীরভাবে সমান হয় যদি তাদের সম্পর্কিত ক্ষেত্রগুলি, উভয় রফতানি এবং অপ্রত্যাশিত, গভীরভাবে সমান হয়।

ফানক মানগুলি গভীরভাবে সমান যদি উভয় শূন্য হয়; অন্যথায় তারা গভীর সমান হয় না।

ইন্টারফেস মানগুলি গভীরভাবে সমান কংক্রিটের মানগুলি ধরে রাখলে।

মানচিত্রের মানগুলি যদি একই মানচিত্রের অবজেক্ট হয় তবে তাদের যদি একই দৈর্ঘ্য হয় এবং তার অনুরূপ কীগুলি (গো সমতা ব্যবহার করে মিলিত হয়) মানচিত্র গভীরভাবে সমান মানগুলিতে থাকে।

পয়েন্টারের মানগুলি গভীরভাবে সমান হয় যদি তারা Go's == অপারেটর ব্যবহার করে সমান হয় বা তারা গভীরভাবে সমান মানগুলিতে নির্দেশ করে।

স্লাইস মানগুলি গভীরভাবে সমান যখন নীচের সমস্তগুলি সত্য হয়: সেগুলি উভয় শূন্য বা উভয় অ-শূন্য, তাদের দৈর্ঘ্য একই, এবং হয় তারা একই অন্তর্নিহিত অ্যারের একই প্রারম্ভিক প্রবেশের দিকে নির্দেশ করে (যা, & x [0 ] == & y [0]) বা তাদের সম্পর্কিত উপাদানগুলি (দৈর্ঘ্য অবধি) গভীর সমান। মনে রাখবেন যে একটি নন-শূন্য ফাঁকা স্লাইস এবং একটি শিল কাটা (উদাহরণস্বরূপ, [] বাইট {} এবং [] বাইট (শূন্য)) সমান নয়।

অন্যান্য মান - সংখ্যা, বল, স্ট্রিং এবং চ্যানেলগুলি - Go's == অপারেটর ব্যবহার করে সমান হলে তারা গভীরভাবে সমান।


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

15
আমি কেবল একটি বেঞ্চমার্ক চালিয়েছি এবং প্রতিবিম্বিত করেছি eep ডিপএকুয়াল একটি লুপের চেয়ে 150 গুণ ধীর। কেউ যদি এই পদ্ধতিটি উত্পাদনে ব্যবহার করতে চান তবে কেবল এফওয়াইআই।
নিকদেপেন

2
এটি একই আইটেমগুলির সাথে এলোমেলোভাবে অর্ডারযুক্ত টুকরাগুলির তুলনা করে না :(
হেমন্ত_নেগি

5
@ হেমন্ত_নেগি দুটি আলাদা টুকরা আলাদা ক্রম থাকলে সমান নয়। আপনি যদি আদেশটিকে অগ্রাহ্য করার সময় দুটি টুকরার সমতার তুলনা করতে চান তবে সেগুলি বাছাই করুন এবং তারপরে একটি স্লাইস থেকে আইটেমগুলি একটি মানচিত্রে সরিয়ে নিন এবং তারপরে পরীক্ষা করুন যে অন্য স্লাইসের প্রতিটি উপাদান মানচিত্রে রয়েছে। (অতিরিক্তভাবে তাদেরও একই দৈর্ঘ্য রয়েছে তা নিশ্চিত করুন)
রবার্ট 229

3
রব পাইক (২০১১ সালে) গোয়ের প্রতিচ্ছবি সম্পর্কে, অফিসিয়াল গো ব্লগে লিখেছিলেন: "এটি একটি শক্তিশালী সরঞ্জাম যা কঠোরভাবে প্রয়োজন না হলে যত্ন সহ ব্যবহার করা উচিত এবং এড়ানো উচিত" ব্লগ.গোলাং.আর.এলজ / অফ-রিফ্লেকশন । আমি কেবল প্রকারের সাথে তুলনা করতে প্রোডাকশন কোডে প্রতিবিম্ব ব্যবহার করব না। এটি লিখতে একটি সহজ ফাংশন। তবে মনে রাখবেন যে এই প্রশ্নেরও বাছাই করা উত্তরের একটি সম্ভাব্য ত্রুটি রয়েছে, এটি থেকে আপনার কী আচরণের প্রত্যাশা রয়েছে: এটি দেখতে পাবে যে স্লাইসগুলি শুরু করা হয়েছে তবে এখনও 0 এবং ক্যাপ 0 টি স্লাইসের সাথে মেলে না যেগুলি হয়েছে ঘোষিত তবে আরম্ভ করা হয়নি।
jrefior

44

এটি প্রতিফলন ব্যবহারের উদাহরণ মাত্র। ডিপএকুয়াল () যা @ ভিক্টরডেরিয়াগিনের উত্তরে দেওয়া হয়।

package main

import (
    "fmt"
    "reflect"
)

func main() {
    a := []int {4,5,6}
    b := []int {4,5,6}
    c := []int {4,5,6,7}

    fmt.Println(reflect.DeepEqual(a, b))
    fmt.Println(reflect.DeepEqual(a, c))

}

ফলাফল:

true
false

এটি খেলার মাঠে চেষ্টা করুন


23

আপনি দুটি থাকে তাহলে []byteতাদের ব্যবহার তুলনা bytes.Equal । গোলং ডকুমেন্টেশন বলে:

সমান একটি বুলিয়ান প্রতিবেদন করে যা a এবং b একই দৈর্ঘ্য এবং একই বাইট রয়েছে কিনা তা ফিরিয়ে দেয়। একটি শূন্য আর্গুমেন্ট একটি খালি স্লাইসের সমতুল্য।

ব্যবহার:

package main

import (
    "fmt"
    "bytes"
)

func main() {
    a := []byte {1,2,3}
    b := []byte {1,2,3}
    c := []byte {1,2,2}

    fmt.Println(bytes.Equal(a, b))
    fmt.Println(bytes.Equal(a, c))
}

এটি মুদ্রণ করবে

true
false

কেন এটি শীর্ষ নয়
লুফ জুরভ

3

এবং এখন জন্য, এখানে https://github.com/google/go-cmp যা

reflect.DeepEqualদুটি মান শব্দার্থগতভাবে সমান কিনা তা তুলনা করার জন্য আরও শক্তিশালী এবং সুরক্ষিত বিকল্প হিসাবে বিবেচিত ।

package main

import (
    "fmt"

    "github.com/google/go-cmp/cmp"
)

func main() {
    a := []byte{1, 2, 3}
    b := []byte{1, 2, 3}

    fmt.Println(cmp.Equal(a, b)) // true
}

1

আপনি যদি কোনও পরীক্ষা লেখার আগ্রহী হন তবে github.com/stretchr/testify/assertআপনার বন্ধু is

ফাইলের একেবারে শুরুতে পাঠাগারটি আমদানি করুন:

import (
    "github.com/stretchr/testify/assert"
)

তারপরে পরীক্ষার ভিতরে আপনি যা করেন:


func TestEquality_SomeSlice (t * testing.T) {
    a := []int{1, 2}
    b := []int{2, 1}
    assert.Equal(t, a, b)
}

অনুরোধ করা ত্রুটিটি হ'ল:

                Diff:
                --- Expected
                +++ Actual
                @@ -1,4 +1,4 @@
                 ([]int) (len=2) {
                + (int) 1,
                  (int) 2,
                - (int) 2,
                  (int) 1,
Test:           TestEquality_SomeSlice

assert.Equalঅভ্যন্তরীণভাবে ব্যবহার করে reflect.DeepEqualযা ধীরে ধীরে চালাতে আপনার টেস্টগুলি তৈরি করতে পারে এবং শেষ পর্যন্ত আপনার পাইপলাইন।
দীপক সাহ

@ প্রদীপসাহ: পারফরম্যান্স পার্থক্যের জন্য আপনার কি মানদণ্ড রয়েছে? আমার অভিজ্ঞতার সাথে পরীক্ষাগুলিতে পারফরম্যান্সের বাধাটি সমান নয়, এবং আপনি দুর্দান্ত মানের বার্তাগুলি পেয়ে যা উত্পাদনশীলতায় একটি উত্সাহ পেয়েছে
গ্যাব্রিয়েল ফার্সনহাইম
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.