ในภาษา Go การเลือกใช้ value receiver หรือ pointer receiver ขึ้นอยู่กับว่าต้องการแก้ไขข้อมูลใน struct หรือ type นั้นๆ หรือไม่ โดยปกติแล้วหากไม่ต้องการเปลี่ยนแปลงข้อมูลใน struct หรือ type นั้น ๆ จะใช้ value receiver ส่วนหากต้องการเปลี่ยนแปลงข้อมูลใน struct หรือ type นั้น ๆ จะใช้ pointer receiver

เมื่อใช้ value receiver มันจะ copy ค่า struct แล้วนำมาใช้งาน ซึ่งจะไม่ส่งผลกระทบกับ struct ต้นฉบับ แต่หากใช้ pointer receiver จะใช้ struct ต้นฉบับและสามารถแก้ไขค่าของ struct ได้โดยตรง ดังนั้น หากต้องการแก้ไขค่าของ struct ใน method นั้น ๆ จะต้องใช้ pointer receiver

ตัวอย่างเช่น เมื่อเราต้องการแก้ไขค่าของ struct ใน method นั้น ๆ เราจะต้องใช้ pointer receiver ดังนี้

type Rectangle struct {
    width, height float64
}

func (r *Rectangle) Scale(factor float64) {
    r.width *= factor
    r.height *= factor
}

แต่หากเราต้องการอ่านค่าของ struct เพียงอย่างเดียวจะไม่ต้องการแก้ไขค่าใด ๆ เราสามารถใช้ value receiver ได้ เช่น

type Rectangle struct {
    width, height float64
}

func (r Rectangle) Area() float64 {
    return r.width * r.height
}

เมื่อรู้ข้อแตกต่างแล้ว เพียงเท่านี้ก็สามารถเลือกใช้งาน receiver แบบต่างๆ ได้เลยครับ