আমি গো এর সাথে তুলনামূলকভাবে পরিচিত, এতে বেশ কয়েকটি ছোট প্রোগ্রাম লিখেছি। মরিচা অবশ্যই, আমি এর সাথে কম পরিচিত কিন্তু নজর রাখছি।
সম্প্রতি http://yager.io/programming/go.html পড়ে , আমি ভেবেছিলাম জেনারিক্স যে দুটি উপায় পরিচালিত হয় সেগুলি আমি ব্যক্তিগতভাবে পরীক্ষা করব কারণ নিবন্ধটি অন্যায়ভাবে সমালোচনা করেছে বলে মনে হয়েছিল বাস্তবে, ইন্টারফেসগুলি তেমন কিছু ছিল না। মার্জিতভাবে সম্পাদন করতে পারে না। রাস্টের বৈশিষ্ট্যগুলি কতটা শক্তিশালী ছিল তা সম্পর্কে হাইপ শুনছিলাম এবং গো সম্পর্কে লোকের সমালোচনা ছাড়া কিছুই ছিল না। গোতে কিছু অভিজ্ঞতা থাকার পরে, আমি ভাবলাম যে এটি কতটা সত্য এবং শেষ পর্যন্ত পার্থক্যগুলি কী। আমি যেটি খুঁজে পেয়েছি তা হল বৈশিষ্টগুলি এবং ইন্টারফেসগুলি বেশ একই রকম! শেষ পর্যন্ত, আমি নিশ্চিত যে আমি কিছু মিস করছি কিনা তা নিশ্চিত নই, সুতরাং এখানে তাদের মিলগুলির একটি দ্রুত শিক্ষামূলক গুরত্ব রয়েছে যাতে আপনি আমাকে বলতে পারেন যে আমি কী মিস করেছি!
এখন, আসুন তাদের ডকুমেন্টেশন থেকে গো ইন্টারফেসগুলি একবার দেখুন :
গো-এর ইন্টারফেসগুলি কোনও সামগ্রীর আচরণ নির্দিষ্ট করার জন্য একটি উপায় সরবরাহ করে: যদি কিছু এটি করতে পারে তবে তা এখানে ব্যবহার করা যেতে পারে।
এখন পর্যন্ত সবচেয়ে সাধারণ ইন্টারফেস Stringer
যা বস্তুর প্রতিনিধিত্ব করে একটি স্ট্রিং দেয়।
type Stringer interface {
String() string
}
সুতরাং, যে কোনও বস্তু যা এর উপরে String()
সংজ্ঞা দিয়েছে তা একটি Stringer
বস্তু object এটি টাইপ স্বাক্ষরগুলিতে ব্যবহার করা যেতে পারে যা func (s Stringer) print()
প্রায় সমস্ত বস্তু নেয় এবং তাদের মুদ্রণ করে।
আমাদেরও আছে interface{}
যা কোনও বস্তু গ্রহণ করে। তারপরে প্রতিফলনের মাধ্যমে আমাদের রানটাইমের সময়টি নির্ধারণ করতে হবে।
এখন, আসুন তাদের ডকুমেন্টেশন থেকে মরিচা বৈশিষ্ট্য একবার দেখুন :
এর সর্বাধিকতম সময়ে, একটি বৈশিষ্ট্য শূন্য বা আরও বেশি পদ্ধতি স্বাক্ষরের একটি সেট। উদাহরণস্বরূপ, আমরা একক পদ্ধতিতে স্বাক্ষর সহ কনসোলে মুদ্রণযোগ্য জিনিসগুলির জন্য বৈশিষ্ট্য মুদ্রণযোগ্য হিসাবে ঘোষণা করতে পারি:
trait Printable {
fn print(&self);
}
এটি তাত্ক্ষণিকভাবে আমাদের গো ইন্টারফেসের সাথে বেশ মিল দেখায়। কেবলমাত্র তফাতটি আমি দেখছি যে আমরা কেবল পদ্ধতিগুলি সংজ্ঞায়নের চেয়ে বৈশিষ্ট্যের 'বাস্তবায়ন' সংজ্ঞায়িত করি। সুতরাং, আমরা না
impl Printable for int {
fn print(&self) { println!("{}", *self) }
}
পরিবর্তে
fn print(a: int) { ... }
বোনাস প্রশ্ন: আপনি যদি কোনও বৈশিষ্ট্য প্রয়োগ করে তবে আপনি ব্যবহার করেন না এমন কোনও ফাংশন সংজ্ঞায়িত করেন তবে জাস্টে কী হবে impl
? এটা ঠিক কাজ করে না?
গো-এর ইন্টারফেসগুলির বিপরীতে, মরিচা টাইপ সিস্টেমে টাইপ পরামিতি রয়েছে যা আপনাকে সঠিক জেনারিকস এবং জিনিসগুলি করতে দেয় যেমন interface{}
সংকলক এবং রানটাইম আসলে টাইপটি জানতে পারে। উদাহরণ স্বরূপ,
trait Seq<T> {
fn length(&self) -> uint;
}
যে কোনও প্রকারে কাজ করে এবং সংকলক জানে যে সংকলন সময়ে সিকোয়েন্স উপাদানগুলির প্রকার প্রতিবিম্বটি ব্যবহার না করে।
এখন, আসল প্রশ্ন: আমি কি এখানে কোনও পার্থক্য মিস করছি? সত্যিই তারা যে মত? আমি এখানে মিস করছি এমন কি আরও কিছু মৌলিক পার্থক্য নেই? (ব্যবহারের ক্ষেত্রে। বাস্তবায়নের বিশদগুলি আকর্ষণীয়, তবে শেষ পর্যন্ত যদি সেগুলি একইভাবে কাজ করে তবে তা গুরুত্বপূর্ণ নয়))
সিনথেটিক পার্থক্য ছাড়াও, আমি দেখতে পাই আসল পার্থক্যগুলি:
- গো-এর
impl
একটি বৈশিষ্ট্য প্রয়োগের জন্য বনাম জংয়ের (?) গুলি দরকার হয় automatic- মার্জিত বনাম সুস্পষ্ট
- মরিচায় টাইপ পরামিতি রয়েছে যা প্রতিবিম্ব ছাড়াই উপযুক্ত জেনারিকের জন্য অনুমতি দেয়।
- সত্যিই এখানে যান কোনও প্রতিক্রিয়া নেই। এটি হ'ল একমাত্র জিনিস যা উল্লেখযোগ্যভাবে আরও শক্তিশালী এবং শেষ পর্যন্ত এটি বিভিন্ন ধরণের স্বাক্ষর সহ কপি এবং পেস্টের পদ্ধতিগুলির কেবলমাত্র একটি প্রতিস্থাপন।
এগুলি কি কেবলমাত্র তুচ্ছ তাত্পর্যপূর্ণ? যদি তা হয় তবে এটি প্রদর্শিত হবে গো এর ইন্টারফেস / টাইপ সিস্টেমটি বাস্তবে, অনুভূত হিসাবে দুর্বল নয়।
AnyMap
মুরগের শক্তিগুলির একটি ভাল প্রদর্শন আমার নিজের , জেনেরিকের সাথে বৈশিষ্ট্যযুক্ত বস্তুগুলির সংমিশ্রণে ভঙ্গুর জিনিসটির একটি সুরক্ষিত এবং অভিব্যক্তিপূর্ণ বিমূর্ততা সরবরাহ করার জন্য যা গো-র প্রয়োজনে লেখা উচিতmap[string]interface{}
।