ทำความเข้าใจกับ Struct ในภาษา Go
ว่าแนวคิดของมันคืออะไร
เทียบกลับไปยัง OOP อย่างไร
การประกาศ struct
การเรียกใช้งาน
กำหนดขอบเขตการใช้งาน

เริ่มที่ Struct มันคืออะไรกันก่อน
เขาบอกว่ามันคือ class ใน OOP

มีคำถามที่น่าสนใจเกี่ยวกับ Go คือ
Go เป็นภาษา Object-Oriented หรือไม่
คำตอบจาก FAQ ของ Go ก็คือ เป็นและไม่เป็น

แต่ Go ไม่มี keyword ชื่อ class นะ มีแต่ struct
ส่วนภาษาอื่นๆ เช่น Java, C#, C++ มีทั้งคู่เลย
แต่ว่าการใช้งานแตกต่างกันโดยสิ้นเชิง

struct คือ ชนิดข้อมูลที่เรากำหนดได้เอง
โดยประกอบไปด้วย fields ต่างๆ

ตัวอย่างเช่น

type Counter struct {
   n int
}

สร้างโครงสร้างข้อมูลชนิด Counter ขึ้นมา
ประกอบไปด้วย field หรือ property ชื่อว่า n เป็นจำนวนเต็ม
เอาไว้นับจำนวนข้อมูล

สิ่งที่สังเกตเห้นได้ชัดก็คือ ใน struct ไม่มี method/function การทำงานใดๆ เลย
นั่นคือสิ่งที่แตกต่างกับพวก Java
แต่สามารถสร้าง method/function ชื่อว่า count() ของ Counter ได้ดังนี้

package main

import "fmt"

type Counter struct {
   n int
}

func (counter *Counter) count() {
   counter.n++
   fmt.Printf("counter = %d\n", counter.n)
}

func main(){
   counter := new(Counter)
   counter.count()
   counter.count()
   counter.count()
}

สามารถทำการ Encapsulate  สำหรับการเข้าถึง Struct และตัวแปรต่างๆ ได้ดังนี้
ในภาษาอื่นๆ อาจจะมี public, protected, private, default
แต่ใน Go นั้นไม่มี แต่มีอะไรที่ง่ายกว่านั้น คือ
ถ้าตัวแรกของชื่อ struct ขึ้นต้นด้วยตัวใหญ่
สามารถเห็นจาก package อื่น เช่น

type notExport struct {
}

type Export struct {
   notExportVariable int
   ExportVariable int
}

เป็นแนวคิดที่เรียบง่ายมาก แต่ใช้ได้ผลดีมาก
และคุณไม่ต้องไปดูที่อื่นเลยว่า ตัวแปรมันมีขอบเขตอยู่ตรงไหน

Reference Websites
http://www.golang-book.com/9
http://golang.org/doc/effective_go.html#interfaces_and_types
http://golangtutorials.blogspot.com/2011/06/structs-in-go-instead-of-classes-in.html
http://www.golang-book.com/9

Tags: