ภาษา Go นั้นมาพร้อมกับเครื่องมือใช้งานแบบคำสั่ง (command) ที่ครบสมบูรณ์ เราสามารถสั่งรันคำสั่ง go
บน terminal เพื่อดูคำสั่งเหล่านั้น:
รูป 1.3 คำสั่ง Go จะแสดงข้อมูลรายละเอียด
คำสั่งทั้งหมดนี้เป็นคำสั่งที่มีประโยชน์ทั้งหมด เรามาดูวิธีการใช้งานกัน
คำสั่งนี้จะเป็นการคอมไพล์ ซึ่งจะคอมไพล์ทั้ง package เองและ package ที่เป็น dependency ด้วย ถ้าหากจำเป็น
- ถ้า package ไม่ใช่ package
main
ยกตัวอย่างเช่นmymath
ใน section 1.2 จะไม่มีอะไรถูกสร้างขึ้นมาหลังการรันคำสั่งgo build
หากเราต้องการได้ไฟล์ package.a
ใน$GOPATH/pkg
ให้ใช้คำสั่งgo install
แทน - ในการณีที่เป็น
main
package แล้ว จะมีการสร้างไฟล์ executable ไว้ภายใต้โฟลเดอร์เดียวกัน แต่หากเราต้องการให้ถูกสร้างไว้ที่$GOPATH/bin
ให้ใช้คำสั่งgo install
หรือgo build -o ${PATH_HERE}/a.exe
แทน - ในการณีที่มีไฟล์อยู่ในโฟลเดอร์หลายไฟล์ แต่เราต้องการที่จะคอมไพล์แค่ไฟล์เดียว สามารถทำได้โดยการเพิ่มชื่อไฟล์ต่อเข้าไปหลัง
go build
ยกตัวอย่างเช่นgo build a.go
ซึ่งหากรันแค่คำสั่งgo build
จะเป็นการคอมไพล์ทุกไฟล์ในโฟลเดอร์นั้น - นอกจากนี้เรายังสามารถกำหนดชื่อให้กับไฟล์ที่ถูกสร้างขึ้นมาได้ด้วย อย่างเช่น ในโปรเจ็ค
mathapp
(จาก section 1.2) การใช้คำสั่งgo build -o astaxie.exe
จะมีไฟล์astaxie.exe
ถูกสร้างขึ้นมาแทนที่จะเป็นmathapp.exe
ซึ่งจะสังเกตได้ว่าชื่อโฟลเดอร์จะถูกใช้โดยปริยายหากไม่ได้กำหนดเป็นค่าอื่น (กรณีไม่ใช่ main package) หรือจะใช้ชื่อตาม source file ไฟล์แรก (กรณี main package)
(อ้างอิงจาก The Go Programming Language Specification ชื่อ package ควรจะเป็นคำที่อยู่ต่อจาก package
ในบรรทัดแรกของ source file ซึ่งไม่จำเป็นว่าต้องเป็นชื่อเดียวกับชื่อโฟลเดอร์ แต่ไฟล์ executable ที่ได้จากการคอมไพล์จะใช้ชื่อโฟลเดอร์เป็นค่าโดยปริยาย)
-
go build
จะไม่สนใจไฟล์ที่ชื่อขึ้นต้นด้วย_
หรือ.
-
หากเราต้องการจะใช้ไฟล์ชื่อแตกต่างกันตามระบบปฎิบัติการแล้วหละก็ สามารถตั้งชื่อไฟล์โดยใส่ suffix ได้ ตัวอย่างเช่น source file ที่ทำงานในการโหลดค่า array อาจจะตั้งชื่อได้ดังนี้
array_linux.go | array_darwin.go | array_windows.go | array_freebsd.go
go build
จะเลือกไฟล์ที่ตรงกับระบบปฎิบัติการที่ใช้ ยกตัวอย่างเช่น ไฟล์ array_linux.go จะถูกคอมไฟล์ในระบบปฎิบัติการ Linux และไฟล์อื่นๆ จะถูกข้ามไป
คำสั่งนี้ใช้ในการลบไฟล์ที่ถูกสร้างขึ้นมาโดยคอมไพเลอร์ ซึ่งรวมถึงทุกไฟล์ดังต่อไปนี้
_obj/ // ไดเร็คทอรี่ object ที่เหลือจากการทำงานของ Makefile
_test/ // ไดเร็คทอรี่ test ที่เหลือจากการทำงานของ Makefile
_testmain.go // ไดเร็คทอรี่ gotest ที่เหลือจากการทำงานของ Makefile
test.out // ไดเร็คทอรี่ test ที่เหลือจากการทำงานของ Makefile
build.out // ไดเร็คทอรี่ test ที่เหลือจากการทำงานของ Makefile
*.[568ao] // ไฟล์ object ที่เหลือจากการทำงานของ Makefile
DIR(.exe) // สร้างจากคำสั่ง go build
DIR.test(.exe) // สร้างจากคำสั่ง go test -c
MAINFILE(.exe) // สร้างจากคำสั่ง go build MAINFILE.go
โดยปรกติผมจะใช้คำสั่งนี้เพื่อลบไฟล์ที่ไม่ต้องการก่อนที่จะอัพโหลดโปรเจ็คไปที่ GitHub ซึ่งไฟล์เหล่านี้มีประโยชน์ในการทำงานบนเครื่อง แต่ไม่ได้มีประโยชน์กับ version control
สำหรับคนที่เคยใช้งาน C/C++ คงจะคุ้นเคยดีกับหัวข้อถกเถียงในเรื่องที่ว่าสไตล์ของ code แบบไหนที่ดีกว่ากัน ระหว่างสไตล์ K&R กับสไตล์ ANSI แต่อย่างไรก็ตาม สำหรับ Go แล้วจะมีสไตล์การเขียน code แบบเดียวที่ถูกกำหนดมา ยกตัวอย่างเช่น วงเล็บด้านซ้ายจะต้องจะต้องถูกใส่อยู่ท้ายบรรทัดเท่านั้น โดยไม่สามารถอยู่เดี่ยวๆ ในบรรทัดใดๆ ได้ ไม่เช่นนั้นก็จะเกิด error ขึ้นตอนคอมไพล์เลยทีเดียว และเป็นเรื่องโชคดีมากที่เราไม่ต้องมาเสียเวลานั่งจำกฎยิบย่อยเหล่านี้เอง go fmt
จะทำงานนี้แทนเรา แค่สั่งคำสั่ง go fmt <File name>.go
ใน terminal เท่านั้น ผมไม่ต้องใช้คำสั่งนี้บ่อยนักเพราะ IDE ต่างๆ
มักจะรันคำสั่งนี้โดยอัตโนมัติในตอนที่เราสั่งบันทึกไฟล์ โดยเราจะคุยกันเรื่อง IDE มากกว่านี้ในบทถัดไป
go fmt
นั้นความจริงแล้วเป็นเพียง alias เท่านั้น ซึ่งเบื้องหลังจะเป็นการสั่งงานด้วย 'gofmt -l -w' ใน package ที่ใช้ชื่อตาม import path
ปรกติเราจะใช้ gofmt -w
มากกว่า go fmt
โดยคำสั่งหลังนี้จะไม่เขียนทับไฟล์เดิมหลังทำการฟอร์แมต code แล้ว โดยการสั่ง gofmt -w src
จะเป็นการสั่งฟอร์แมตทั้งโปรเจ็ค
คำสั่งนี้จะเป็นการดึง package มาใช้งานจากเครื่องอื่น โดยตั้งแต่ต้นนั้นจะ support การดึงมาจาก BitBucket, GitHub, Google Code และ Launchpad โดยจะเกิดการทำงานสองอย่างขึ้นจากการสั่งคำสั่งนี้ อย่างแรกคือ Go จะดาวน์โหลด source code มา เสร็จแล้วจะสั่ง go install
ให้เองเลย แต่ก่อนที่เราจะใช้คำสั่งนี้ กรุณาตรวจสอบให้มั่นใจว่ามีการติดตั้งเครื่องมือที่เกี่ยวข้องไว้ก่อนแล้ว ดังนี้
BitBucket (Mercurial Git)
GitHub (git)
Google Code (Git, Mercurial, Subversion)
Launchpad (Bazaar)
หากต้องการใช้คำสั่งนี้ เราต้องทำการติดตั้งเครื่องมือที่จำเป็นเหล่านี้ก่อน และอย่าลืมอัพเดทค่าตัวแปร $PATH
ด้วย แต่อย่างไรก็ตาม คำสั่งนี้ก็ยัง support การใช้งานกับ domain name อื่นๆ โดยสามารถดูข้อมูลเพิ่มเติมได้จากคำสั่ง go help importpath
คำสั่งนี้จะเป็นการคอมไพล์ package ทุกอัน และทำการ generate ไฟล์ เสร็จแล้วย้ายไฟล์ที่ถูก generate ขึ้นมานี้ไปไว้ที่ $GOPATH/pkg
หรือ $GOPATH/bin
คำสั่งนี้จะเป็นการโหลดไฟล์ทุกอันที่ชื่อไฟล์ลงท้ายด้วย *_test.go
และ generate ไฟล์ test และเมื่อทำงานเสร็จแล้วจะได้ผลลัพธ์ที่หน้าจอที่ดูเหมือนตัวอย่างนี้
ok archive/tar 0.011s
FAIL archive/zip 0.022s
ok compress/gzip 0.033s
...
โดยปรกติมันจะทำการสั่งรัน tests นั่นเอง โดยสามารถดูรายละเอียดเพิ่มได้โดยใช้คำสั่ง go help testflag
หลายคนพูดว่าเราไม่ต้องการเอกสารเพิ่มเติมจากแหล่งอื่นๆ ในการใช้งานภาษา Go (จริงๆ แล้วผมได้สร้าง CHM ไว้แล้ว) เพราะ Go นั้นมาพร้อมกับเอกสารและเครื่องมือที่ทรงพลังอยู่แล้ว
แล้วการเรียกดูข้อมูลของ package ในเอกสารนั้น ต้องทำอย่างไรหละ? อย่างเช่น หากเราต้องการหาข้อมูลของ package ประเภท builtin
ต่างๆ เราสามารถใช้คำสั่ง godoc builtin
และก็เหมือนกันกับคำสั่ง godoc net/http
จะเป็นการเรียกดูเอกสารของ package http
นั่นเอง หากเราต้องการดูรายละเอียดที่เจาะจงลงไปที่ระดับ function สามารถใช้คำสั่ง go fmt Printf
และใช้คำสั่ง godoc -src fmt
หากต้องการดู source code
สั่งคำสั่ง godoc -http=:8080
แล้วเปิดเบราเซอร์ไปที่ 127.0.0.1:8080
เราจะสามารถดูเอกสารของ golang.org บนจากบนเครื่องของเราเองได้ แต่มีข้อมูลเฉพาะ package มาตรฐานเท่านั้น แต่ก็จะมีของ package อื่นที่อยู่ใน $GOPATH/pkg
ด้วย ซึ่งเป็นสิ่งที่เยี่ยมมากสำหรับคนที่เจ็บปวดกับ Great Firewall ของจีน
นอกจากคำสั่งต่างๆ ที่กล่าวมาแล้ว Go ยังมีคำสั่งอื่นๆ อีก ดังนี้
go fix // อัพเกรด code จากเวอร์ชั่นเก่าก่อน go1 ไปเป็นเวอร์ชั่นใหม่ซึ่งใหม่กว่า go1
go version // เรียกดูข้อมูลเวอร์ชั่นของ Go
go env // เรียกดูข้อมูลตัวแปร environment ที่เกี่ยวข้องกับ Go
go list // เรียกดูรายชื่อ package ที่ทำการติดตั้งไปแล้ว
go run // รัน application โดยการคอมไพล์เป็นไฟล์ชั่วคราวก่อน
โดยคำสั่งที่ได้กล่าวมานี้ ยังมีรายละเอียดการใช้งานเพิ่มเติมอื่นๆ อีกมากมาย โดยเราจะสามารถเรียกดูได้โดยใช้คำสั่ง go help <command>
- Directory
- บทก่อนหน้า: $GOPATH และ workspace
- บทถัดไป: เครื่องมือในการพัฒนาของ Go