কেন একটি "নতুন" আছে?


49

আমরা এখনও কেন আছি তা নিয়ে আমি এখনও বিস্মিত new

আপনি যখন কোনও কাঠামো ইনস্ট্যান্ট করতে চান, আপনি এটি করেন

t := Thing{}

এবং আপনি একটি নতুন দৃষ্টিকোণটি করে পয়েন্টার পেতে পারেন

t := &Thing{}

তবে এই সম্ভাবনাটিও রয়েছে:

t := new(Thing)

এই শেষটি বাকী ভাষার থেকে কিছুটা পরক বলে মনে হচ্ছে। &Thing{}যেমনটি পরিষ্কার এবং সংক্ষিপ্ত new(Thing)এবং এটি আপনি কেবল অন্যত্র ব্যবহার করেন এমন কেবলমাত্র নির্মাণকেই ব্যবহার করে। আপনি এটি &Thing{3}বা এটিকে পরিবর্তন করতে পারেন এটি আরও বর্ধিত &Thing{Feets:7}

আমার মতে, পরিপূরক কীওয়ার্ড 1 থাকা ব্যয়বহুল, এটি ভাষা আরও জটিল করে তোলে এবং আপনার অবশ্যই যা জানা উচিত তা যুক্ত করে। এবং এটি স্ট্রাক্টটি ইনস্ট্যান্ট করার পিছনে কী আগত তা আগমনকারীদের কাছে মাস্ক করা যেতে পারে।

এটি আরও একটি সংরক্ষিত শব্দ করে।

তাহলে পিছনে যুক্তি কী new? এটি কখনও কখনও দরকারী? আমাদের এটি ব্যবহার করা উচিত?


1 : হ্যাঁ, আমি জানি এটি ব্যাকরণ পর্যায়ে কোনও কীওয়ার্ড নয়, আপনি এটি ছায়া দিতে পারেন , তবে এটি যুক্তিযুক্ত বিকাশকারী, একটি সংরক্ষিত শব্দটির পক্ষে এটি পরিবর্তন করে না।


3
"... যাও কোডার ..." - এই কারণ। এফ # / Haskell, / ইত্যাদি। সি বিকাশকারীদের কাছে খুব এলিয়েন এবং সে কারণেই তারা ~ 0 ট্র্যাকশন পাচ্ছে। স্কালা একটি প্রচেষ্টা করেছে এবং এখন এটি আরও বেশি অ্যাক্সেসযোগ্য এবং শুনেছি।
ডেন

12
একই ধারণা অনুসারে, পাইথন এবং রুবি সি বিকাশকারীদের কাছে খুব এলিয়েন, কারণ তারা অজানা কীওয়ার্ডগুলি, "অদ্ভুত" সিনট্যাকটিকাল বিধিগুলি (ব্রেসগুলি কোথায়?) এবং অদ্ভুত শব্দার্থবিজ্ঞান (জেনারেটর? মেটাক্ল্যাশস? সজ্জকার?) ব্যবহার করে। তবুও তারা ~ 0 ট্র্যাকশন পান না, একেবারে বিপরীত।
Xion

8
@ জিয়ন: আপনি রুবির প্রাথমিক বৃদ্ধির হারকে দেখেছেন? এটি এখন কোথায় রয়েছে তা পেতে যুগে যুগে সময় লেগেছিল (যথাযথ হতে 18 বছর)। পাইথন আরও পুরানো (1991!)।
জোচিম সউর

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

4
একটি পার্শ্ব নোট: নতুন গোতে কোনও কীওয়ার্ড নয়। এটি একটি অন্তর্নির্মিত ফাংশন।
মনীষ মালিক

উত্তর:


44

জিজ্ঞাসা করার সর্বোত্তম উপায় সম্ভবত এটিতে কাজ করা লোকদের পক্ষে; আমি ঠিক কি করেছি !

TL; ড: এটা মূলত সেখানে অনেক আগে থেকেই আছেন makeএবং &{}, এবং এটি এখনও ফাংশন কিছু পরিস্থিতিতে ব্যবহার করার জন্য নয়।

মূলত, এখানে সবচেয়ে গুরুত্বপূর্ণ অংশ উদ্ধৃত হয়েছে:

সুতরাং নতুন পিছনে যুক্তি কি? এটি দরকারী কিছু? আমাদের এটি ব্যবহার করা উচিত?

আপনি নতুন ছাড়া এটি করতে পারবেন না

v := new(int)
*v++
fmt.Println(*v)

নতুন গো এর শিরোনাম বৈশিষ্ট্য নয়, আপনি এটি প্রায়শই ব্যবহার করা দেখতে পাবেন না, তবে যখন আপনার এটি প্রয়োজন হবে, এটি সেখানে।

চিয়ার্স

ডেভ

আর একটি উত্তর পরে এই ধরণের সমাধান দেখায়:

vv := 0
v := &vv
*v++
fmt.Println(*v)

আমি আরও ব্যাখ্যা চেয়েছি:

সুতরাং মূলত, ডেভ এর বক্তব্য সত্যিই দাঁড়ায় না?

এমন জায়গাগুলি রয়েছে যেখানে ঠিকানার ঠিকানাটি নেওয়ার জন্য এটি একটি নতুন ভেরিয়েবলের দিকে ঝলকানো অসুবিধাজনক।

নতুন (টি) এর বহু-পদক্ষেপের আইডিয়ম হওয়ার চেয়ে তাত্ক্ষণিক সরল অর্থ রয়েছে।

ডেভের বক্তব্যটি কেবল তখনই পড়ে যদি কেবল প্রযুক্তিগত সম্ভাবনা (ছাড়াই করা new) নিজেরাই বাধ্য করে।

এটি নিয়ে আলোচনা করা হয়নি কারণ এটি প্রায় স্পষ্ট ছিল যে গো এর কাছে থাকা উচিত কারণ প্রায় প্রতিটি ভাষায়ই এটি থাকে?

"আমরা কি রাখব new?" সময়ে সময়ে আলোচনা পপ আপ। যেহেতু আমরা গো 2 এর পূর্ব পর্যন্ত এটি গ্রহণ করতে পারছি না, যদি আমি প্রতিশ্রুতিটি সঠিকভাবে বুঝতে পারি, তবে আবার লুপটি ঘুরিয়ে দেওয়ার মতো কিছুই হবে বলে মনে হয় না; গো -২ এর সময়টি ভাবার মতো, আমাদের কাছে কিছু আলাদা এবং আরও ভাল ধারণা থাকতে পারে ...

ক্রিস

এটি বেশিরভাগ historicalতিহাসিক কারণেও রয়েছে:

আপনি প্রকল্পের ইতিহাস বিবেচনা করা প্রয়োজন। আমার মনে হয় সেখানে তৈরি হওয়ার আগে নতুন পরিচয় হয়।

ঐটা সত্য. আসলে আমরা মেক আইডিয়া নিয়ে আসার আগে কিছুক্ষণ লড়াই করেছি। আপনি যদি সংগ্রহস্থল লগগুলিতে লক্ষ্য করেন তবে দেখতে পাবেন যে কেবলমাত্র জানুয়ারী 2009-এ দেখা যাচ্ছে, 9a924177598f সংশোধন করুন।

নতুন অন্তর্নির্মিত কার্যক্রমে একটি যৌগিক আক্ষরিকের ঠিকানা নেওয়ার জন্য & {pre এর ধারণাও ছিল (এবং সিনট্যাক্সটি কিছুটা অর্থে ভুল; এটি সম্ভবত (* টি) {টি-এর ক্ষেত্র হওয়া উচিত তবে যথেষ্ট ছিল না এটি পরিবর্তন করার কারণ)।

নতুন ফাংশনটি কঠোরভাবে প্রয়োজনীয় নয় তবে কোডটি বাস্তবে এটি ব্যবহার করে বলে মনে হচ্ছে। এই মুহুর্তে এ থেকে মুক্তি পাওয়া শক্ত।

ইয়ান


আমি অন্যের লিঙ্কগুলি দেখে খুশি হব "আমরা কি নতুন রাখব?" সময় সময় পপ আপ যা আলোচনা
অস্বীকার করেন সাগুরেট

কিছু কিছু আপনাকে v := &(0)অস্থায়ী ভেরিয়েবলটি করা এবং এড়ানো থেকে বাধা দেয়? (আমি কোনও গো জানি না))
অ্যালেক্স ফেইনম্যান

3
@ অ্যালেক্সফিনম্যান যেমন 0আক্ষরিক ধ্রুবক হিসাবে আপনি এর ঠিকানা নিতে পারেন না। আপনি যদি একটি নির্দিষ্ট ধরণেরও চান তবে একটি সমস্যা দেখা দিতে পারে। এ কারণেই একটি সিনট্যাক্স পছন্দসই &intবা কার্যকর &int(0)হতে পারে (যদিও সেরা সিনট্যাক্স সম্পর্কে খুব একটা ভাবেননি)। কলিন্স দেখানো হিসাবে এটি দুটি লাইনে করা খুব ভাল ( vv := 0; v := &vv)।
সাগ্ররেট

14
"যেহেতু আমরা গো 2 না হওয়া পর্যন্ত এটি বের করতে পারব না ... ... যা সবাই জানেন, কখনই ঘটবে না কারণ Go 2এটি ক্ষতিকারক হিসাবে বিবেচিত হয়।
ম্যাসন হুইলারের

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