go - online - সি এর ত্রৈমাসিক অপারেটর এর সমার্থক গো সমতুল্য কি?




সমার্থক শব্দের অভিধান (5)

সি / সি ++ (এবং সেই পরিবারের অনেকগুলি ভাষা), একটি শর্তের উপর নির্ভর করে একটি পরিবর্তনশীল ঘোষণা এবং সূচনা করতে একটি সাধারণ মূদ্রা তাত্ত্বিক শর্তাধীন অপারেটর ব্যবহার করে:

int index = val > 0 ? val : -val

যান শর্তাধীন অপারেটর আছে না। উপরের কোডের একই টুকরা প্রয়োগ করার সবচেয়ে কার্যকরী উপায় কী? আমি নিম্নলিখিত সমাধান এসেছিলেন, কিন্তু এটা বেশ verbose মনে হয়

var index int

if val > 0 {
    index = val
} else {
    index = -val
}

কিছু ভাল আছে?


কোন Go তে একটি ত্রিনিন্যাশনাল অপারেটর নেই, যদি / অন্য সিনট্যাক্সটি নির্বোধ উপায় ব্যবহার করে: http://golang.org/doc/faq#Does_Go_have_a_ternary_form


ধরুন আপনার নিম্নোক্ত ত্রৈমাসিক অভিব্যক্তি রয়েছে (সি):

int a = test ? 1 : 2;

গো-এ নির্বোধ পদ্ধতির কেবল if একটি ব্লক ব্যবহার করা হয়:

var a int

if test {
  a = 1
} else {
  a = 2
}

তবে, যে আপনার প্রয়োজনীয়তা মাপসই করা হবে না। আমার ক্ষেত্রে, আমি একটি কোড প্রজন্মের টেমপ্লেট জন্য একটি ইনলাইন অভিব্যক্তি প্রয়োজন।

আমি অবিলম্বে মূল্যায়ন বেনামী ফাংশন ব্যবহার:

a := func() int { if test { return 1 } else { return 2 } }()

এই উভয় শাখা মূল্যায়ন করা হয় না তা নিশ্চিত করে।


মানচিত্র ত্রান্তিক বন্ধনী ছাড়া পড়া সহজ:

c := map[bool]int{true: 1, false: 0} [5 > 4]

যদি আপনার সমস্ত শাখাগুলি পার্শ্ব প্রতিক্রিয়াগুলি তৈরি করে বা তুলনামূলকভাবে ব্যয়বহুল হয় তবে নিম্নোক্তভাবে সেমিক্যালিক - সংরক্ষণযোগ্য রিফ্যাক্টিং হবে:

index := func() int {
    if val > 0 {
        return printPositiveAndReturn(val)
    } else {
        return slowlyReturn(-val)  // or slowlyNegate(val)
    }
}();  # exactly one branch will be evaluated

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

আপনি গুটিভো এর পদ্ধতির নিঃসন্দেহে প্রয়োগ করতে হলে নোট করুন:

    index := printPositiveAndReturn(val);
    if val <= 0 {
        index = slowlyReturn(-val);  // or slowlyNegate(val)
    }

আপনি একটি ভিন্ন আচরণ সঙ্গে একটি প্রোগ্রাম পেতে চাই; ক্ষেত্রে val <= 0 প্রোগ্রাম একটি অ-ইতিবাচক মান মুদ্রণ করবে যখন এটি করা উচিত নয়! (আনুষ্ঠানিকভাবে, যদি আপনি শাখাগুলি বিপরীত করেন, আপনি অপ্রয়োজনীয়ভাবে ধীরে ধীরে ফাংশন কল করে ওভারহেড পরিচয় করিয়ে দেবেন।)


func Ternary(statement bool, a, b interface{}) interface{} {
    if statement {
        return a
    }
    return b
}

func Abs(n int) int {
    return Ternary(n >= 0, n, -n).(int)
}

এই / অন্য আর যদি ঢাল প্রয়োজন কিন্তু কাজ করবে না। অবগতির জন্য:

BenchmarkAbsTernary-8 100000000 18.8 ns / op

BenchmarkAbsIfElse-8 2000000000 0.27 ns / op





conditional-operator