Method Sets

จากที่ได้อธิบายเรื่อง Method Receiver ไปแล้วว่าแบบที่เป็น Pointer กับแบบที่เป็น Type ธรรมดา ต่างกันอย่างไร วันนี้จะมาดูว่าเวลาที่เรากำหนดค่าของ Type หรือ Pointer ของ Type ให้กับตัวแปรแบบ Interface นั้น Interface จะรู้ได้อย่างไรว่า Type นี้ implement interface นี้หรือไม่ สำหรับ Go นั้นจะดูว่า Type นั้นมี Method Sets ตรงกับที่ระบุไว้ใน Interface ครบหรือไม่นั่นเอง

ตัวอย่างเช่น มี interface ดังนี้

type IO interface {
	Read() string
	Write(string)
}

interface นี้มีสอง Methods คือ Read กับ Write ดังนั้นเราจึงรู้ว่า Type ที่จะกำหนดค่าให้ interface นี้ได้ต้องมีสอง Methods นี้

ทีนี้เรารู้ว่า Method Receiver มันเป็นได้ทั้ง Type ธรรมดาและ Pointer ของ Type นี่สิ จึงเกิดคำถามว่า แล้วถ้าเรากำหนด Pointer ของ Type ให้ interface แล้ว Go จะนับ Methods อะไรบ้างเป็น Method ของ Type Pointer และ ถ้ากำหนดค่าของ Type ธรรมดาให้ interface Go จะนับ Methods อะไรบ้าง

สำหรับ Go มีหลักการดู Method Sets ง่ายๆว่า

ถ้าตัวแปรที่กำหนดใช้ interface เป็น Type ธรรมดา แล้ว Method ที่ประกาศให้ receiver เป็น Type ธรรมดาเท่านั้นที่จะนับเป็น Method Sets

ถ้าตัวแปรที่กำหนดให้ interface เป็น Pointer ของ Type แล้ว Method ที่ประกาศให้ receiver เป็น Type ธรรมดาและ Pointer ของ Type จะถูกนับเป็น Method Sets ด้วยทั้งหมด

มาดูตัวอย่างกันดีกว่า

จากตัวอย่างจะเห็นว่า เมื่อกำหนด pointer เป็น receiver ให้กับ method Read และ Write แล้ว เราสามารถกำหนดได้แค่ pointer ให้กับ interface IO กำหนด Type ธรรมดาไม่ได้ มันจะฟ้องว่าไม่ได้ implement interface IO

เทียบกับ method String ที่กำหนด receiver เป็น Type ธรรมดา สามารถกำหนดค่าให้กับ interface Stringer ได้ทั้ง Type ธรรมดา และ Pointer ของ Type นั่นเอง