রিসিভার এবং ইন্টারফেস

মানের রিসিভার সহ মেথডগুলি মান এবং পয়েন্টার উভয় ব্যবহার করে কল করা যেতে পারে।

পয়েন্টার রিসিভার সহ মেথডগুলি শুধুমাত্র পয়েন্টার বা ঠিকানা যুক্ত মান ব্যবহার করে কল করা যেতে পারে।

এর উদাহরণ,

type S struct {
  data string
}

func (s S) Read() string {
  return s.data
}

func (s *S) Write(str string) {
  s.data = str
}

sVals := map[int]S{1: {"A"}}

// আপনি শুধুমাত্র একটি মান ব্যবহার করে Read কল করতে পারবেন
sVals[1].Read()

// এটি কম্পাইল হবে না:
// sVals[1].Write("test")

sPtrs := map[int]*S{1: {"A"}}

// উভয় Read এবং Write মেথডগুলি একটি পয়েন্টার ব্যবহার করে কল করা যেতে পারে
sPtrs[1].Read()
sPtrs[1].Write("test")

একইভাবে, যদিও মেথডের মান রিসিভার থাকে, তবে এটি একটি ইন্টারফেস পয়েন্টার রিসিভার ব্যবহার করে মেট করতে পারে।

type F interface {
  f()
}

type S1 struct{}

func (s S1) f() {}

type S2 struct{}

func (s *S2) f() {}

s1Val := S1{}
s1Ptr := &S1{}
s2Val := S2{}
s2Ptr := &S2{}

var i F
i = s1Val
i = s1Ptr
i = s2Ptr

// নিম্নলিখিত কোডটি কম্পাইল হবে না কারণ s2Val একটি মান এবং S2 এর f মেথডের মান রিসিভার নেই
// i = s2Val

Effective Go অতি ভাল ভাবে পয়েন্টার বনাম মান নিয়ে স্পষ্ট ব্যাখ্যা করে।

অতিরিক্ত নোট:

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

দুটি নির্দিষ্ট ধরনের ম্যাচিং আছে:

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

i = s2Val কেন ত্রুটি হয়, তা অবশ্যই মান মেথড সেট এবং ইন্টারফেস মেলে না এই কারণে।