เรื่องพื้นฐานอย่าง Package ที่เรียบง่ายของ Go

Box ผมขอเริ่มซีรี่ยส์แบ่งปันการเขียน Golang ให้สนุก โดยเริ่มจากเนื้อหาตามแนวของ A Tour of Go พร้อมใส่ใข่ และเครื่องปรุงให้อร่อย (สำหรับ A Tour of Go หากใครติดตั้ง Go เสร็จแล้วก็สามารถเปิดแบบ offline เล่นได้ด้วยคำสั่ง $go tool tour)

Package
เป็นสิ่งที่ช่วยจัดระเบียบโค้ดของเราได้อย่างน่าทึ่ง ระบบ Package ของ Go ถูกออกแบบมาเรียบง่ายและมีประสิทธิภาพ ซึ่งแรกๆ อาจต้องทำความเข้าใจธรรมชาติของมันบ้าง แต่หลังจากเริ่มเขียนเป็นและโปรแกรมใหญ่ขึ้น เราจะเริ่มเห็นชัดเจนขึ้นเรื่อยๆ ว่าทำไม Go จึงเขียนสนุก เพราะเริ่มจาก Package ที่จัดการง่ายนั่นเอง

พื้นฐานอันดับแรก ทุกโปรแกรมของ Go ถูกสร้างขึ้นจากหลายๆ Package รวมกัน และโปรแกรมจะเริ่มต้นที่ Package main เสมอ (เว้นแต่เรากำลังจะเขียน Library) และจะมี function main() ตัวเดียวเป็นจุดเริ่มต้น โดยตัว main package ก็จะเรียก package อื่นผ่านคีย์เวิร์ด import

แต่ละไฟล์ .go จะกำหนดชื่อ package ไว้ที่ต้นไฟล์เสมอ compiler จะดูจากจุดนั้น จุดสำคัญที่ควรจำคือเราควรตั้งชื่อ package ให้ตรงกับชื่อไดเรคทอรี่ที่เก็บไฟล์นั้น ซึ่งควรจะสอดคล้องตามโครงสร้างของ $GOPATH/src/… เสมอ และที่สำคัญควรสมัคร Git Repository ไว้ใช้งานกับโค้ดของเราแล้ววางไดเรคทอรี่ให้สอดคล้องกัน เช่นผมเก็บไฟล์ $GOPATH ไว้ที่ ~/work เวลาอ้าง package จะเริ่มต้นหลัง ~/work/src/… เป็นต้นไป และถ้าผมมี git repo อยู่ที่ github.com/mrtomyum ผมก็จะสร้างไดเรคทอรี่ดังนี้ ~/work/src/github.com/mrtomyum/<ชื่อ repo>

สังเกตุได้ว่าต่อมาถ้าเราอยากจะได้ Library ที่มีเทพเขียนแจกมาใช้งานฟรี เราจะใช้ท่าอัญเชิญเทพมาประทับอย่าง go get github.com/… (ตามด้วยชื่อผู้สร้างและชื่อแพคเกจนั้นๆ) สังเกตุว่าส่วนใหญ่ก็จะใช้ github.com อะนะ พอเสร็จเราก็ลองไปค้นในไดเรคทอรี่หลัง src/ ก็จะจ๊ะเอ๋ไอ้ที่เราอัญเชิญมาประทับอยู่ตามพาธมาตรฐานนี้ ที่นี้ก็เดาได้ง่ายละว่าเราเอา Package อะไรไว้ตรงไหน ไม่งง เลยเรียกได้ว่าชีวิต dev ผูกติดกับ Repository อย่างแยกไม่ออก ซึ่งการสร้างโครงสร้างตามนี้ไม่บังคับ แต่เป็นแนวปฏิบัติของโปรแกรมเมอร์ที่ดีใน พ.ศ.นี้ ที่ควรมี Repository ของตัวเอง เขียนอะไรเสร็จก็ควร commit, push ขึ้น public repo ซะ น้องๆ ที่ยังไม่มี github หรือ bitbucket account เป็นของตัวเองถ้ามาสมัครงานพี่จะดูโปรไฟล์และผลงานน้องยังไงครับ

จากนั้นเมื่อเราจะอ้างถึง package อื่นในไฟล์ .go ของเราๆ ก็กรอก path หลัง ~/work/src/… มาทั้งหมด ไม่ว่าจะเป็น package ย่อยของเราเอง หรือ 3rd party ก็ตาม compiler จะมองหาไฟล์ตาม path ดังกล่าว ยกเว้น standard package ซึ่งสามารถอ้างถึง package ได้โดยตรง

ถ้าโปรแกรมของเราเริ่มใหญ่ แล้วอยากแบ่งโครงสร้างตามแนว MVC เราก็อาจแบ่งแพ็คเกจและไดเรคเทอรี่ได้ตามนี้

<Project>/
./controllers
./models
./views
main.go

ทีนี้ ถ้าอยากอ้างถึง package models จากจุดอื่นๆ เราก็ใส่ import “github.com/<github.user>/<project>/models

โพสหน้าเราจะไปดูวิธีอ้างถึง Package ในโค้ดของเรากัน