Skip to content

Latest commit

 

History

History
107 lines (66 loc) · 15.2 KB

File metadata and controls

107 lines (66 loc) · 15.2 KB

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 ชื่อ 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 ไว้แล้ว) เพราะ 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