গোতে পয়েন্টার থাকার বিষয়টি কী?


100

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

আমি কি কিছু মিস করছি বা গো-তে পয়েন্টার দিচ্ছি কেবল একটি অপ্রয়োজনীয় জটিলতা?


4
এখানে একটি প্রশ্ন যা স্পষ্ট করতে সাহায্য করতে পারে: stackoverflow.com/questions/795160/… মান দ্বারা রেফারেন্স পাস এবং রেফারেন্স দ্বারা সত্যই পাস করার মধ্যে পার্থক্য আছে।
আর মার্টিনহো ফার্নান্দেস

4
দ্রষ্টব্য: প্রশ্নটি জাভা সম্পর্কে, তবে এটি এখানেও প্রযোজ্য।
আর মার্টিনহো ফার্নান্দেস

4
"এবং কিছু অন্তর্নির্মিত প্রকারের জন্য যেমন মানচিত্র এবং চ্যানেলগুলি রেফারেন্স দ্বারা অন্তর্ভুক্ত থাকে" " না, সমস্ত কিছুই গো-এ-পাস-ভ্যালু। কিছু ধরণের রেফারেন্স ধরণের (অনানুষ্ঠানিকভাবে বর্ণনা করা হয়), কারণ তাদের অভ্যন্তরীণ পরিবর্তনীয় অবস্থা রয়েছে।
newacct

এই প্রশ্নের সমস্যাটি হ'ল "রেফারেন্স" কোনও সংজ্ঞাযুক্ত বৈশিষ্ট্যযুক্ত জিনিস নয়। "রেফারেন্স" শব্দটি খুব অস্পষ্ট। আমরা উত্তরগুলিতে দেখতে পারি যে কত লোক "রেফারেন্স" শব্দটিতে বিভিন্ন জিনিস পড়ে things সুতরাং এই প্রশ্নটি গো পয়েন্টার এবং প্রশ্নের মনে থাকা রেফারেন্সগুলির মধ্যে ঠিক কী পার্থক্য রয়েছে তা বিশদভাবে ব্যাখ্যা করা উচিত।
mtraceur

উত্তর:


37

আমি http://www.golang-book.com/8 থেকে নেওয়া উদাহরণটি সত্যিই পছন্দ করি

func zero(x int) {
    x = 0
}
func main() {
    x := 5
    zero(x)
    fmt.Println(x) // x is still 5
}

হিসাবে বিপরীতে

func zero(xPtr *int) {
    *xPtr = 0
}
func main() {
    x := 5
    zero(&x)
    fmt.Println(x) // x is 0
}

43
প্রশ্নটি ছিল "কেন আমাদের উল্লেখগুলির পরিবর্তে পয়েন্টার রয়েছে " এবং আমি বুঝতে পারি না কেন এই উদাহরণটি উল্লেখগুলির সাথে কাজ করবে না।
AndreKR

@ আন্ড্রে কেআর কারণ আমরা নির্বাচন করতে পারি যে রেফারেন্স দিয়ে পাস করতে হবে বা মান দিয়ে পাস করতে হবে। কিছু উদাহরণ রয়েছে যেখানে উভয়ই আকাঙ্ক্ষিত হতে পারে।
জেডিএসওয়েটবিট

10
@ ডিজেমেথানম্যান এটি "পয়েন্টার বনাম রেফারেন্স", "পয়েন্টার বনাম পাস-বাই-মান" নয়!
AndreKR

পার্শ্ব প্রতিক্রিয়া হিসাবে, পাস-বাই-রেফারেন্স সি # 2.0 তে "রেফ" কীওয়ার্ডের মাধ্যমে যুক্ত করা হয়েছিল। অবশ্যই নির্দিষ্ট কিছু ক্ষেত্রে পয়েন্টারগুলি এখনও আরও সুবিধাজনক, কারণ আমরা পয়েন্টার থেকে পয়েন্টার পয়েন্টার করতে পারি ...
রবি ফ্যান

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

34

পয়েন্টারগুলি বিভিন্ন কারণে কার্যকর f পয়েন্টারগুলি মেমরি লেআউটের উপর নিয়ন্ত্রণের অনুমতি দেয় (সিপিইউ ক্যাশেটির কার্যকারিতা প্রভাবিত করে)। গো-তে আমরা এমন একটি কাঠামো সংজ্ঞায়িত করতে পারি যেখানে সমস্ত সদস্যের সাবলীল স্মৃতি থাকে:

type Point struct {
  x, y int
}

type LineSegment struct {
  source, destination Point
}

এই ক্ষেত্রে Pointস্ট্রাকচারগুলি LineSegmentস্ট্রাক্টের মধ্যে এমবেড করা হয় । তবে আপনি সবসময় সরাসরি ডেটা এম্বেড করতে পারবেন না। আপনি যদি বাইনারি গাছ বা লিঙ্কযুক্ত তালিকার মতো কাঠামোগুলিকে সমর্থন করতে চান তবে আপনাকে কোনও ধরণের পয়েন্টার সমর্থন করতে হবে।

type TreeNode {
  value int
  left  *TreeNode
  right *TreeNode
}

জাভা, পাইথন ইত্যাদিতে এই সমস্যা নেই কারণ এটি আপনাকে সম্মিলিত প্রকারের এম্বেড করার অনুমতি দেয় না, তাই এম্বেডিং এবং পয়েন্টিংয়ের মধ্যে সিন্টেক্সিকভাবে আলাদা করার প্রয়োজন নেই no

সুইফট / সি # স্ট্র্ট সহ সমস্যাগুলি পয়েন্টারগুলির সাথে সমাধান করা হয়েছে

এটি সম্পাদন করার একটি সম্ভাব্য বিকল্প হ'ল সি # এবং সুইফ্টের মধ্যে structএবং এর মধ্যে পার্থক্য করা class। তবে এর সীমাবদ্ধতা আছে। আপনি সাধারণত উল্লেখ করতে পারেন যে স্ট্রাক্ট inoutঅনুলিপি করা এড়াতে কোনও ফাংশন একটি প্যারামিটার হিসাবে স্ট্রাক্ট নেয় , এটি আপনাকে স্ট্রাক্টসে রেফারেন্স (পয়েন্টার) সংরক্ষণ করার অনুমতি দেয় না। এর অর্থ আপনি যখন কোনও পুলকে বরাদ্দকারী তৈরি করতে (যেমন নীচে দেখুন) দরকারী দরকারী পান তখন আপনি কোনও কাঠামোটিকে কখনই রেফারেন্স টাইপ হিসাবে ব্যবহার করতে পারবেন না।

কাস্টম মেমোরি বরাদ্দকারী

পয়েন্টার ব্যবহার করে আপনি নিজের পুল বরাদ্দকারীও তৈরি করতে পারেন (কেবলমাত্র নীতিটি দেখানোর জন্য মুছে ফেলা প্রচুর চেকের সাহায্যে এটি খুব সরলীকৃত):

type TreeNode {
  value int
  left  *TreeNode
  right *TreeNode

  nextFreeNode *TreeNode; // For memory allocation
}

var pool [1024]TreeNode
var firstFreeNode *TreeNode = &pool[0] 

func poolAlloc() *TreeNode {
    node := firstFreeNode
    firstFreeNode  = firstFreeNode.nextFreeNode
    return node
}

func freeNode(node *TreeNode) {
    node.nextFreeNode = firstFreeNode
    firstFreeNode = node
}

দুটি মান অদলবদল করুন

পয়েন্টারগুলি আপনাকে প্রয়োগ করতেও দেয় swap। এটি দুটি ভেরিয়েবলের মান অদলবদল করে:

func swap(a *int, b *int) {
   temp := *a
   *a = *b
   *b = temp
}

উপসংহার

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


7
সি # রেফারেন্স দ্বারা স্ট্রোকগুলি পাস করার অনুমতি দেয়। "রেফ" এবং "আউট" কীওয়ার্ডগুলি দেখুন।
olegz

4
ঠিক আছে তাই এটি সুইফ্ট মত। আমি আমার উদাহরণ আপডেট করার একটি উপায় সম্পর্কে চিন্তা করব।
এরিক এনহিম

29

রেফারেন্সগুলি পুনরায় নিয়োগ করা যাবে না, যখন পয়েন্টারগুলি পারে can এটি একা অনেক ক্ষেত্রে পয়েন্টারগুলিকে দরকারী করে তোলে যেখানে উল্লেখগুলি ব্যবহার করা যায়নি।


17
রেফারেন্সগুলি পুনরায় স্বাক্ষরযোগ্য কিনা তা ভাষা-নির্দিষ্ট প্রয়োগের সমস্যা।
ক্র্যানটোক

28

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


গো প্রোগ্রামিং ল্যাঙ্গুয়েজ: ল্যাঙ্গুয়েজ ডিজাইনের এফএকিউ: অ্যারেগুলি মান হিসাবে কেন মানচিত্র, টুকরো এবং চ্যানেলগুলি উল্লেখ করা হয়?

"এই বিষয়ে অনেক ইতিহাস রয়েছে। প্রথমদিকে, মানচিত্র এবং চ্যানেলগুলি সিনথেটিকভাবে পয়েন্টার ছিল এবং একটি পয়েন্টারবিহীন উদাহরণটি ঘোষণা করা বা ব্যবহার করা অসম্ভব ছিল। এছাড়াও, অ্যারেগুলি কীভাবে কাজ করা উচিত তা নিয়ে আমরা লড়াই করেছি। অবশেষে আমরা সিদ্ধান্ত নিয়েছিলাম যে কঠোর বিচ্ছেদ নির্দেশক এবং মানগুলির ভাষা ব্যবহার করা আরও শক্ত করে তুলেছে। অ্যারেগুলির রেফারেন্স ফর্মটি পরিচালনা করতে টুকরা সহ রেফারেন্স প্রকারের প্রবর্তনগুলি এই সমস্যাগুলিকে সমাধান করেছে Re রেফারেন্সের ধরণগুলি ভাষার সাথে কিছুটা আফসোসযোগ্য জটিলতা যুক্ত করে তবে সেগুলির ব্যবহারের উপর একটি বড় প্রভাব রয়েছে: যান একটি হয়ে ওঠে যখন তারা চালু হয়েছিল তখন আরও উত্পাদনশীল, আরামদায়ক ভাষা language "


দ্রুত সংকলন গো প্রোগ্রামিং ভাষার একটি প্রধান নকশা লক্ষ্য; যে এর খরচ আছে। হতাহতের মধ্যে একটি হ'ল ভেরিয়েবলগুলিকে চিহ্নিত করার ক্ষমতা (মৌলিক সংকলনের সময় ধ্রুবকগুলি বাদে) এবং পরামিতিগুলি অপরিবর্তনীয় বলে মনে হয়। এটি অনুরোধ করা হয়েছে, কিন্তু প্রত্যাখ্যান করা হয়েছে।


গোলং-বাদাম: ভাষা যান। কিছু প্রতিক্রিয়া এবং সন্দেহ।

"টাইপ সিস্টেমে কনস্ট যুক্ত করা এটি সর্বত্র প্রদর্শিত হতে বাধ্য করে এবং কিছু পরিবর্তন হলে এটি সর্বত্র সরিয়ে নিতে বাধ্য করে While যদিও কিছু উপায়ে অপরিবর্তনীয় বস্তু চিহ্নিতকরণে কিছুটা সুবিধা থাকতে পারে, আমরা মনে করি না কনস্টের ধরণের যোগ্যতা অর্জনের উপায়টি হয় is যাও."


এফডাব্লুআইডাব্লু, গোতে "রেফারেন্সের ধরণগুলি" আবারও পুনরায় নিয়োগযোগ্য। তারা আরও অন্তর্নিহিত পয়েন্টার মত?
ম্যাট জয়েনার

4
এগুলি কেবল স্ট্রাইকগুলির জন্য বিশেষ সিনট্যাক্স যা একটি পয়েন্টার (এবং দৈর্ঘ্য, ক্ষমতা, ...) ধারণ করে।
এম কে 12
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.