108 lines
15 KiB
Markdown
108 lines
15 KiB
Markdown
# 1.3 คำสั่งต่างๆ ของ Go
|
|
|
|
## คำสั่งต่างๆ ของ Go
|
|
|
|
ภาษา Go นั้นมาพร้อมกับเครื่องมือใช้งานแบบคำสั่ง (command) ที่ครบสมบูรณ์ เราสามารถสั่งรันคำสั่ง `go` บน terminal เพื่อดูคำสั่งเหล่านั้น:
|
|
|
|

|
|
|
|
รูป 1.3 คำสั่ง Go จะแสดงข้อมูลรายละเอียด
|
|
|
|
คำสั่งทั้งหมดนี้เป็นคำสั่งที่มีประโยชน์ทั้งหมด เรามาดูวิธีการใช้งานกัน
|
|
|
|
## go build
|
|
|
|
คำสั่งนี้จะเป็นการคอมไพล์ ซึ่งจะคอมไพล์ทั้ง 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](https://golang.org/ref/spec) ชื่อ 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 และไฟล์อื่นๆ จะถูกข้ามไป
|
|
|
|
## go clean
|
|
|
|
คำสั่งนี้ใช้ในการลบไฟล์ที่ถูกสร้างขึ้นมาโดยคอมไพเลอร์ ซึ่งรวมถึงทุกไฟล์ดังต่อไปนี้
|
|
|
|
_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
|
|
|
|
## go fmt และ gofmt
|
|
|
|
สำหรับคนที่เคยใช้งาน 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` จะเป็นการสั่งฟอร์แมตทั้งโปรเจ็ค
|
|
|
|
## go get
|
|
|
|
คำสั่งนี้จะเป็นการดึง 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`
|
|
|
|
## go install
|
|
|
|
คำสั่งนี้จะเป็นการคอมไพล์ package ทุกอัน และทำการ generate ไฟล์ เสร็จแล้วย้ายไฟล์ที่ถูก generate ขึ้นมานี้ไปไว้ที่ `$GOPATH/pkg` หรือ `$GOPATH/bin`
|
|
|
|
## go test
|
|
|
|
คำสั่งนี้จะเป็นการโหลดไฟล์ทุกอันที่ชื่อไฟล์ลงท้ายด้วย `*_test.go` และ generate ไฟล์ test และเมื่อทำงานเสร็จแล้วจะได้ผลลัพธ์ที่หน้าจอที่ดูเหมือนตัวอย่างนี้
|
|
|
|
ok archive/tar 0.011s
|
|
FAIL archive/zip 0.022s
|
|
ok compress/gzip 0.033s
|
|
...
|
|
|
|
โดยปรกติมันจะทำการสั่งรัน tests นั่นเอง โดยสามารถดูรายละเอียดเพิ่มได้โดยใช้คำสั่ง `go help testflag`
|
|
|
|
## godoc
|
|
|
|
หลายคนพูดว่าเราไม่ต้องการเอกสารเพิ่มเติมจากแหล่งอื่นๆ ในการใช้งานภาษา Go (จริงๆ แล้วผมได้สร้าง [CHM](https://github.com/astaxie/godoc) ไว้แล้ว) เพราะ 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>`
|
|
|
|
## Links
|
|
|
|
- [Directory](preface.md)
|
|
- บทก่อนหน้า: [$GOPATH และ workspace](01.2.md)
|
|
- บทถัดไป: [เครื่องมือในการพัฒนาของ Go](01.4.md)
|