การเขียน method on struct

คราวที่แล้วผมอธิบายการจำลอง method on struct ซึ่งอาจจะข้ามขั้นตอนไปหน่อย สำหรับมือใหม่ วันนี้เลยอยากจะขออธิบายว่าการสร้าง method on struct ว่าเป็นอย่างไรสักหน่อยดีกว่า
การสร้าง method on struct ในภาษาโก ทำให้เราสามารถเขียนฟังก์ชัน ให้กับโครงสร้างข้อมูล(struct) ได้ คล้ายๆกับการเขียนคลาสในภาษาออบเจ็กต์ เช่น

type example struct {
   value string
}

func (e *example) setValue(s string) {
   e.value = s
}

func (e *example) getValue() string {
   return e.value
}

ตามตัวอย่างนี้เป็นการสร้างฟังก์ชัน setValue และ getValue สำหรับโครงสร้างข้อมูลที่ชื่อ example โดยทำหน้าที่เป็น setter และ getter ให้กับค่า value ซึ่งความเป็นจริงเวลาเราเขียนโก เราคงไม่เขียนอะไรกันแบบนี้(555)
เมื่อตอนที่เริ่มเขียนโกใหม่ๆ ผมสงสัย(ไม่แน่ใจว่าใครสงสัยบ้าง) ว่าการผูกฟังก์ชันทำไมต้องใช้ตัวชี้(pointer) เพื่ออ้างถึงโครงสร้างที่จะไปผูกด้วย สามารถใช้ชื่อโครงสร้างตรงๆแบบไม่ใช้ตัวชี้ได้หรือไม่ ก็เลยเกิดการทดลองดังนี้ครับ

package main

import "fmt"

type pointer struct {
   index int
}

func (p *pointer) plus() {
   p.index += 1
   println(p.index)
}

type value struct {
   index int
}

func (v value) plus() {
   v.index += 1
   println(v.index)
}
func main() {
   fmt.Println("Hello, playground")
   p := pointer{1}
   v := value{1}
   p.plus()
   v.plus()
   fmt.Println(p.index)
   fmt.Println(v.index)
}

ลองเอาตัวอย่างนี้ไปเล่นกันใน http://play.golang.org/  (http://play.golang.org/p/t0B3PfYeYk) ดูจะพบว่า การผูกฟังก์ชันแบบไม่ใช้ตัวชี้นั้น จะไม่สามารถเปลียนแปลงค่าในโครงสร้างข้อมูลหลักได้ เรียกว่าเป็นการผูกเพื่อให้เป็น ฟังก์ชันของค่านั้นๆไปเลย ส่วนการผูกฟังก์ชันโดยใช้ตัวชี้ จะทำให้สามารถเปลี่ยนแปลงค่าในโครงสร้างข้อมูลได้โดยตรง เรียกว่าทำให้เป็นฟังก์ชันของโครงสร้างข้อมูลนั้น

คิดว่าทั้งสองแบบนั้นมีประโยชน์ตามแต่จะเลือกนำไปใช้ หวังว่าจะสนุกกับภาษาโกเหมือนผมนะครับ