কেন কোনও জেনেরিক নেই?


126

দাবি অস্বীকার: আমি কেবলমাত্র একদিনের জন্য গোয়ের সাথে খেলেছি, তাই খুব ভাল সুযোগ রয়েছে যে আমি অনেকটা মিস করেছি।

জেনেরিক্স / টেমপ্লেটগুলি / গো-ইন-এর জন্য কেন কোনও বাস্তব সমর্থন নেই তা কি কেউ জানেন? সুতরাং একটি জেনেরিক আছেmap , তবে এটি সংকলক দ্বারা সরবরাহ করা হয়েছে, যখন একটি গো প্রোগ্রামার তার নিজের প্রয়োগটি লিখতে পারে না। যতটা সম্ভব অরথোগোনালকে ਗੋ করার বিষয়ে সমস্ত আলোচনা সহ আমি কেন একটি জেনেরিক প্রকার ব্যবহার করতে পারি তবে একটি নতুন তৈরি করতে পারি না?

বিশেষত যখন ফাংশনাল প্রোগ্রামিংয়ের কথা আসে, সেখানে ল্যাম্বডাস, এমনকি ক্লোজারও রয়েছে, তবে একটি স্ট্যাটিক টাইপ সিস্টেমের সাথে জেনেরিকের অভাব রয়েছে, আমি কীভাবে লিখব, ভাল, জেনেরিক উচ্চতর অর্ডার ফাংশনগুলি filter(predicate, list)? ঠিক আছে, লিঙ্কযুক্ত তালিকাগুলি এবং এর মতো কাজগুলি করা যেতে পারেinterface{} ধরণের সুরক্ষা ত্যাগের মাধ্যমে ।

এসও / গুগলের তাত্ক্ষণিক অনুসন্ধানে কোনও অন্তর্দৃষ্টি প্রকাশিত না হওয়ায় এটি জেনেরিকগুলির মতো মনে হচ্ছে, যদি তা না হয় তবে গোপনে উত্তরোত্তর হিসাবে যুক্ত হবে। আমি থম্পসনকে জাভা লোকের চেয়ে আরও ভাল করার জন্য বিশ্বাস করি, তবে জেনারিকগুলি কেন বাইরে রাখি? বা সেগুলি পরিকল্পনা করা হয়েছে এবং এখনও কার্যকর করা হয়নি?


আমি মনে করি এটি উল্লেখ করার মতো: ইন্টারফেস using using ব্যবহার করা ধরণের সুরক্ষা ত্যাগ করে না। এটি একটি প্রকার, এবং অন্য ধরণের ক্ষেত্রে দৃ cast়ভাবে পোক্ত করা যেতে পারে (কাস্ট করা যায় না), তবে এই দাবিগুলি এখনও টাইপ সুরক্ষা বজায় রাখতে রানটাইম চেকগুলি আহ্বান করে।
cthom06

12
interface{}স্থিতিশীল সুরক্ষা ত্যাগ । তবে স্কিমের উল্লেখ করার সময় এটি করা কিছুটা অদ্ভুত অভিযোগ, পরের অনুচ্ছেদটি, যেহেতু স্কিমের সাধারণত স্থির ধরণের চেকিং থাকে না।
পুলি

@ পুলি: আমি যে বিষয়টি নিয়ে উদ্বিগ্ন তা কোনও ভাষার মধ্যে এক উদাহরণের সাথে লেগে রয়েছে। হয় আমি স্থির ধরনের সুরক্ষা এক্সওআর ব্যবহার করছি না using

2
btw এর বানান 'Go', 'Go' নয়, আপনি golang.org এ দেখতে পারেন। এবং এটি কেস-সংবেদনশীল। :-)
পুলি

1
কিভাবে github.com/facebookgo/generics সম্পর্কে ?
থেলিমিস্ট

উত্তর:


78

এই উত্তরটি আপনি এখানে পাবেন: http://golang.org/doc/faq#generics

কেন জেনেরিক ধরণ নেই?

জেনারিকস ভালভাবে কোনও সময়ে যুক্ত হতে পারে। আমরা তাদের জন্য কোন তাত্পর্য অনুভব করি না, যদিও আমরা বুঝতে পারি কিছু প্রোগ্রামাররা তা করে।

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

এটি একটি উন্মুক্ত ইস্যু হিসাবে রয়ে গেছে।


14
@ আমেবি, "ফাঁকা ইন্টারফেস", বানানটি interface{}হ'ল সর্বাধিক প্রাথমিক ইন্টারফেস প্রকার এবং প্রতিটি বস্তু এটি সরবরাহ করে। যদি আপনি তাদের ধারন করে একটি ধারক তৈরি করেন তবে এটি যে কোনও (অ-আদিম) বস্তুকে গ্রহণ করতে পারে। সুতরাং এটি Objectsজাভা ধারক একটি ধারক অনুরূপ ।
পুলি

4
@ ইয়িনওয়াং জেনেরিক্স কোনও ধরণের অনুমানযুক্ত পরিবেশে এতটা সহজ নয়। অধিক গুরুত্বের সাথে; ইন্টারফেস {} সি এর শূন্য * পয়েন্টার সমতুল্য নয় আরও ভাল উপমা সি # এর সিস্টেম হতে হবে bউজেক্ট বা উদ্দেশ্য-সি এর আইডি ধরণের। প্রকারের তথ্য সংরক্ষণ করা হয় এবং এটি কংক্রিটের ধরণে "castালাই" (প্রকৃতপক্ষে প্রকৃতপক্ষে) করা যায়। কৌতূহলের
টবোন

2
@ টবোন সি # এর সিস্টেম.অবজেক্ট (বা জাভা অবজেক্ট অফ সে) মূলত আমি "সি এর শূন্য পয়েন্টার" বলতে চাইছি (সেই অংশটিকে উপেক্ষা করে যে আপনি সেই ভাষাগুলিতে পয়েন্টার পাটিগণিত করতে পারবেন না)। স্থির প্রকারের তথ্যগুলি হারাতে পারে সেগুলি। একটি কাস্ট বেশি সাহায্য করবে না কারণ আপনি রানটাইম ত্রুটি পাবেন।
ইয়ান

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

3
@ ক্রিস্টোফারফোহল আমি মনে করি কেবল জাভা জেনারিকদেরই আদিম ধরণের বক্সিং / আনবক্সিংয়ের সমস্যা আছে? সি # র রিফাইড জেনেরিকের সমস্যা নেই।
ca9163d9

32

যান 2

Https://blog.golang.org/go2draft এ জেনেরিকদের জন্য একটি খসড়া নকশা রয়েছে ।

যান 1

গো প্রবীণদের মধ্যে অন্যতম রাশ কক্স জেনেরিক দ্বিমা নামে একটি ব্লগ পোস্ট লিখেছিলেন , যাতে তিনি জিজ্ঞাসা করেছেন

… আপনি কি ধীর প্রোগ্রামার, ধীর সংকলক এবং স্ফীত বাইনারিগুলি চান, না মৃত্যুর কার্যকর সময়?

ধীর প্রোগ্রামাররা কোনও জেনেরিকের ফলস্বরূপ নয়, ধীর সংকলকগুলি জেনারিকের মতো সি ++ এর কারণে হয় এবং জাভা ব্যবহার করে এমন বক্সিং-আনবক্সিং পদ্ধতির ধীরে ধীরে কার্যকরকরণের সময় হয়।

চতুর্থ সম্ভাবনাটি ব্লগে উল্লিখিত হয়নি সি # রুটে চলছে। সি ++ এর মতো বিশেষায়িত কোড উত্পন্ন করা হচ্ছে, তবে রানটাইমে যখন এটি প্রয়োজন হয়। আমি সত্যিই এটি পছন্দ করি তবে গো সি এর থেকে খুব আলাদা নয় তাই এটি সম্ভবত মোটেই প্রযোজ্য নয় ...

আমার উল্লেখ করা উচিত যে জনপ্রিয় জাভা ১.৪ ব্যবহার করে জেনেরিক প্রোগ্রামিংয়ের কৌশল interface{}যেমন বক্সিং-আনবক্সিংয়ের সমান সমস্যাগুলি ভুগতে পারে (কারণ আমরা এটি করছি), কম্পাইল সময়ের ধরণের সুরক্ষা ক্ষতি ছাড়াও। ছোট প্রকারের জন্য (ints এর মত) গো interface{}প্রকারটি অনুকূলিত করে যাতে ইন্টারফেস cast interface এ কাস্ট করা কালিগুলির একটি তালিকা মেমরির একটি সংক্ষিপ্ত অঞ্চল দখল করে এবং সাধারণ ints থেকে মাত্র দ্বিগুণ স্থান নেয়। interface{}যদিও কাস্ট করার সময় রানটাইম চেকগুলির ওভারহেড রয়েছে । রেফারেন্স

যে সমস্ত প্রকল্পগুলি জেনেরিক সমর্থন যুক্ত করে (তাদের বেশ কয়েকটি রয়েছে এবং সবগুলি আকর্ষণীয়) একইভাবে সংকলন টাইম কোড জেনারেশনের সি ++ রুটে চলে যায়।


আমার এই দ্বিধাটির সমাধানটি হ'ল ডিফল্টতে যান "ধীর সঞ্চালনের সময়গুলি" তে প্রোগ্রামটির বিকল্প হিসাবে এবং "স্লো কমপ্লায়ারস এবং ব্লোয়েটেড বাইনারি" মোডে সর্বাধিক পারফরম্যান্স সংবেদনশীল অংশগুলি পুনরায় সংকলনের বিকল্প হিসাবে with খুব খারাপ যে লোকেরা আসলে এর মতো স্টাফ বাস্তবায়ন করে তারা সি ++ রুট নিয়ে যায়।
ব্যবহারকারী 7610

1
এটি উল্লেখ করা হয়েছিল যে ছোট প্রকারের (অর্থাত্ int) যা []interface{}2x র্যাম হিসাবে ব্যবহৃত হয় []int। সত্য হিসাবে, এমনকি আরও ছোট ধরণের (যেমন বাইট) 16x পর্যন্ত র‌্যাম ব্যবহার করে []byte
বিএমইনার

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

দ্বিধাদ্বন্দ্বটি কোন পদ্ধতিটি বেছে নেবে সে সম্পর্কে। আপনি যদি সি ++ পন্থায় গিয়ে দ্বিধাটি সমাধান করেন তবে দ্বিধাটি সমাধান হয়ে যায়।
ব্যবহারকারী 7610

9

যদিও জেনেরিকগুলি বর্তমানে অন্তর্নির্মিত নয়, সেখানে জেনেরিকগুলির বেশ কয়েকটি বহিরাগত বাস্তবায়ন রয়েছে যা কোড তৈরি করে এমন ছোট্ট ইউটিলিটিগুলির সংমিশ্রণে মন্তব্য ব্যবহার করে।

এই জাতীয় একটি বাস্তবায়ন এখানে দেওয়া হয়েছে: http://clipperhouse.github.io/gen/


1

আসলে, এই পোস্ট অনুসারে :

অনেক লোক উপসংহারে এসেছেন (ভুলভাবে) যে গো দলের অবস্থান "" গো কখনও জেনেরিকস পাবে না। " বিপরীতে, আমরা সম্ভাব্য জেনারিকগুলি উভয়ই বুঝতে পারি যে, Go কে আরও নমনীয় এবং শক্তিশালী করা এবং Go কে আরও জটিল করে তোলা। যদি আমরা জেনেরিকগুলি যুক্ত করতে চাই তবে আমরা এটিকে এমনভাবে করতে চাই যা যতটা সম্ভব সামান্য সংযোজন জটিলতায় যতটা নমনীয়তা এবং শক্তি পায়।


-1

প্যারামেত্রিক পলিমরফিজম (জেনেরিক্স) হয় জন্য বিবেচনা অধীন যান 2

এই পদ্ধতির দ্বারা একটি চুক্তির ধারণা প্রবর্তিত হবে , যা ধরণের পরামিতিগুলির প্রতিবন্ধকতা প্রকাশ করতে ব্যবহার করা যেতে পারে:

contract Addable(a T) {
  a + a // Could be += also
}

এই জাতীয় চুক্তিটি তখন এভাবে ব্যবহার করা যেতে পারে:

func Sum(type T Addable)(l []T) (total T) {
  for _, e := range l {
    total += e
  }
  return total
}

এটি এই পর্যায়ে একটি প্রস্তাব


আপনার filter(predicate, list)ফাংশনটি এই জাতীয় ধরণের প্যারামিটার দিয়ে প্রয়োগ করা যেতে পারে:

func Filter(type T)(f func(T) bool, l []T) (result []T) {
  for _, e := range l {
    if f(e) {
      result = append(result, e)
    }
  }
  return result
}

এই ক্ষেত্রে, বাধা দেওয়ার দরকার নেই T


1
আপনি আজ এই উত্তরটি পড়ি তাহলে, মনে রাখবেন যে চুক্তি খসড়া প্রস্তাব থেকে বাদ করা হয়েছে: go.googlesource.com/proposal/+/refs/heads/master/design/...
jub0bs
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.