আমি যেতে নতুন এবং আমি সি স্টাইলের স্ট্যাক-ভিত্তিক প্রোগ্রামিংয়ের মধ্যে কিছুটা কংগ্রেসীয় বিচ্ছিন্নতা অনুভব করছি যেখানে স্বয়ংক্রিয় ভেরিয়েবলগুলি স্ট্যাকের উপরে বাস করে এবং গিরির উপরে পাইথন স্টাইলের স্ট্যাক-ভিত্তিক-প্রোগ্রামিং যেখানে বরাদ্দ থাকে স্ট্যাকের মধ্যে যে জিনিসটি থাকে কেবল তা হ'ল স্তরের বস্তুর উল্লেখ / পয়েন্টার।
আমি যতদূর বলতে পারি, নিম্নলিখিত দুটি ফাংশন একই আউটপুট দেয়:
func myFunction() (*MyStructType, error) {
var chunk *MyStructType = new(HeaderChunk)
...
return chunk, nil
}
func myFunction() (*MyStructType, error) {
var chunk MyStructType
...
return &chunk, nil
}
অর্থাত্ একটি নতুন কাঠামো বরাদ্দ করুন এবং এটি ফিরিয়ে দিন।
আমি যদি সিটিতে লিখতাম তবে প্রথমটি একটি গাদাতে একটি বস্তু রেখে দিত এবং দ্বিতীয়টি স্ট্যাকের উপরে রাখত। প্রথমটি স্তূপে একটি পয়েন্টার ফেরত দেবে, দ্বিতীয়টি স্ট্যাকের দিকে একটি পয়েন্টার ফিরিয়ে দেবে, যা ফাংশনটি ফিরে আসার সময় বাষ্পীভূত হয়ে উঠত, এটি একটি খারাপ জিনিস হবে।
আমি যদি পাইথনে এটি লিখতাম (বা সি # ব্যতীত আরও অনেক আধুনিক ভাষায়) উদাহরণ 2 সম্ভব হত না।
আমি পেয়েছি যে গো আবর্জনা উভয় মান সংগ্রহ করে, তাই উপরের দুটি ফর্মই ভাল।
উদ্ধৃতি থেকে:
দ্রষ্টব্য, সি থেকে পৃথক, স্থানীয় ভেরিয়েবলের ঠিকানা ফেরত দেওয়া পুরোপুরি ঠিক আছে; ভেরিয়েবলের সাথে সম্পর্কিত স্টোরেজটি ফাংশন ফিরে আসার পরে বেঁচে থাকে। প্রকৃতপক্ষে, যৌগিক আক্ষরিকের ঠিকানা নেওয়া প্রতিটি সময় এটি মূল্যায়ন করার সময় একটি নতুন ঘটনা বরাদ্দ করে, তাই আমরা এই শেষ দুটি লাইন একত্রিত করতে পারি।
তবে এটি বেশ কয়েকটি প্রশ্ন উত্থাপন করে।
1 - উদাহরণস্বরূপ 1, স্ট্রাকটি গাদাতে ঘোষিত হয়। উদাহরণ 2 সম্পর্কে কি? এটি স্ট্যাকের উপর একইভাবে ঘোষিত হয়েছে এটি সি তে হবে কি না এটিও গাদা হয়ে যায়?
2 - যদি স্ট্যাকের উপর উদাহরণ 2 ঘোষণা করা হয় তবে ফাংশনটি ফিরে আসার পরে এটি কীভাবে উপলব্ধ থাকবে?
3 - উদাহরণস্বরূপ 2 যদি গাদাতে ঘোষিত হয়, তবে স্ট্রাক্টগুলি রেফারেন্সের পরিবর্তে মান দ্বারা কীভাবে পাস হবে? এই ক্ষেত্রে পয়েন্টার বিন্দু কি?