এটি আমার পক্ষে খুব স্পষ্ট নয় যে ক্ষেত্রে আমি সর্বদা পয়েন্টার রিসিভার ব্যবহারের পরিবর্তে কোনও মান রিসিভার ব্যবহার করতে চাই।
দস্তাবেজগুলি থেকে পুনরুদ্ধার করতে:
type T struct {
a int
}
func (tv T) Mv(a int) int { return 0 } // value receiver
func (tp *T) Mp(f float32) float32 { return 1 } // pointer receiver
ডক্স এছাড়াও বলেন, "এই ধরনের মৌলিক ধরনের, টুকরা এবং ক্ষুদ্র structs হিসাবে ধরনের জন্য, একটি মান রিসিভার খুব সস্তা, তাই যদি না পদ্ধতির শব্দার্থবিদ্যা একটি পয়েন্টার প্রয়োজন, একটি মান রিসিভার দক্ষ ও স্পষ্ট।"
প্রথম পয়েন্ট এটি বলে যে এটি "খুব সস্তা", তবে প্রশ্নটি আরও বেশি এটি পয়েন্টার রিসিভারের চেয়ে সস্তা। সুতরাং আমি একটি ছোট বেঞ্চমার্ক তৈরি করেছি (গিস্টের কোড) যা আমাকে দেখিয়েছে যে পয়েন্টার রিসিভার এমন স্ট্রাক্টের জন্য এমনকি দ্রুত যেখানে কেবল একটি স্ট্রিং ফিল্ড রয়েছে। এগুলি ফলাফল:
// Struct one empty string property
BenchmarkChangePointerReceiver 2000000000 0.36 ns/op
BenchmarkChangeItValueReceiver 500000000 3.62 ns/op
// Struct one zero int property
BenchmarkChangePointerReceiver 2000000000 0.36 ns/op
BenchmarkChangeItValueReceiver 2000000000 0.36 ns/op
(সম্পাদনা করুন: দয়া করে নোট করুন যে দ্বিতীয় পয়েন্টটি নতুন গো সংস্করণগুলিতে অবৈধ হয়ে গেছে, মন্তব্য দেখুন) ।
দ্বিতীয় দফায় এটি বলে যে এটি "দক্ষ এবং পরিষ্কার" যা স্বাদের বিষয়, তাই না? ব্যক্তিগতভাবে আমি সর্বত্র একইভাবে ব্যবহার করে ধারাবাহিকতা পছন্দ করি। দক্ষতা কোন অর্থে? কর্মক্ষমতা অনুযায়ী এটি পয়েন্টার প্রায় সবসময় আরও দক্ষ হয় বলে মনে হয়। একটি সংস্থার সম্পত্তি সহ কয়েকটি পরীক্ষা-নিরীক্ষা মান প্রাপ্তির ন্যূনতম সুবিধা দেখায় (0.01-0.1 এনএস / অপেক্ষার পরিসর)
কেউ কি আমাকে এমন একটি মামলা বলতে পারেন যেখানে কোনও মান রিসিভার স্পষ্টতই আরও বেশি বোঝায় তখন পয়েন্টার রিসিভার? বা আমি মাপদণ্ডে কিছু ভুল করছি, আমি কি অন্যান্য বিষয়গুলি উপেক্ষা করেছি?