หลังจากที่ Go 1.11 beta 2 ถูกปล่อยออกมาให้ลองใช้งานกัน
ซึ่งตัวเต็ม ๆ จะปล่อยมาในเดือนสิงหาคมนี้
feature ที่น่าสนใจคือ Go Module

จาก go get -> vendor -> vgo -> go mod ใน Go 1.11

ดูเอกสารเพิ่มเติมได้ที่ Release Note

มาเริ่มต้นใช้งานกันหน่อย

$cd $GOPATH/src/module_name
$go mod -init

go: modules disabled inside GOPATH/src by GO111MODULE=auto; see 'go help modules'

ทำการเปิด Go module feature ด้วยคำสั่ง

$export GO111MODULE=on

ทำการสร้างไฟล์ go.mod สำหรับอธิบาย module

$go mod -init

go: creating new go.mod: module main

จากนั้นก็ทำการแก้ไขไฟล์ go.mod เพื่อระบุ dependency ที่ใช้งานดังนี้

ทำการ build ระบบ จะทำการ download dependency ที่กำหนดไว้ใน go.mod ดังนี้

$go build

go: downloading github.com/gin-gonic/gin v1.1.4
go: finding github.com/manucorporat/sse latest
go: finding github.com/mattn/go-isatty v0.0.3
go: finding github.com/golang/protobuf/proto latest
go: finding golang.org/x/net/context latest
go: finding gopkg.in/go-playground/validator.v8 v8.18.2
go: finding gopkg.in/yaml.v2 v2.2.1
go: finding golang.org/x/net latest
go: downloading golang.org/x/net v0.0.0-20180724234803-3673e40ba225
go: downloading github.com/mattn/go-isatty v0.0.3
go: downloading github.com/manucorporat/sse v0.0.0-20160126180136-ee05b128a739
go: downloading gopkg.in/go-playground/validator.v8 v8.18.2
go: downloading gopkg.in/yaml.v2 v2.2.1
go: finding github.com/golang/protobuf v1.1.0
go: downloading github.com/golang/protobuf v1.1.0
go: finding gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405

สิ่งที่น่าสนใจคือ เรื่องของ version

การตั้งชื่อของ version ต้องเป็นไปตาม semantically versioned
นั่นคือมีรูปแบบดังนี้ v(major).(minor).(patch) เสมอ
ดังนั้นถ้า dependency ใด ไม่มี version ตามนี้จะไม่สามารถใช้งานได้

ยกตัวอย่างเช่น go-gin นั้น version ล่าสุดคือ v2.0
ดังนั้นจึงไม่สามารถกำหนดใน go.mod ได้
จะเกิด error ดังนี้

go.mod:4: invalid module version "v2.0": no matching versions for query "v2.0"

ถ้าต้องการ update depedency ใหม่ทั้งหมด
ใช้คำสั่งดังนี้

$go mod -sync

go: downloading gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405
go: finding github.com/stretchr/testify/assert latest
go: finding golang.org/x/sync/errgroup latest
go: finding gopkg.in/go-playground/assert.v1 v1.2.1
go: finding golang.org/x/sync latest
go: downloading golang.org/x/sync v0.0.0-20180314180146-1d60e4601c6f
go: finding golang.org/x/sys/unix latest
go: downloading gopkg.in/go-playground/assert.v1 v1.2.1
go: finding golang.org/x/sys latest
go: downloading golang.org/x/sys v0.0.0-20180724212812-e072cadbbdc8
go: finding github.com/stretchr/testify v1.2.2
go: downloading github.com/stretchr/testify v1.2.2
go: finding github.com/pmezard/go-difflib/difflib latest
go: finding github.com/davecgh/go-spew/spew latest
go: finding github.com/davecgh/go-spew v1.1.0
go: downloading github.com/davecgh/go-spew v1.1.0
go: finding github.com/pmezard/go-difflib v1.0.0
go: downloading github.com/pmezard/go-difflib v1.0.0

คำสั่งอื่น ๆ ของ go mod ประกอบไปด้วย

$go mod -sync
$go mod -fmt #go fmt สำหรับไฟล์ go.mod และ go.sum
$go mod -fix #จัดการไฟล์ go.mod
$go mod -graph #สำหรับดู depedency ทั้งหมดที่ใช้งาน

ยังไม่พอนะ ถ้ายังต้องทำการส่งมอบในรูปแบบ vendor นั่นคือสร้าง vendor folder ขึ้นมาในระบบ
แน่นอนว่า Go Module ยังสนับสนุนด้วยคำสั่ง
$go mod -vendor

มาดูในไฟล์ go.mod กันดูบ้าง

โดยที่ require นั้นจะมี comment indirect มาให้
เป็นการบอกว่าคือ depedency ที่เราไม่ได้กำหนด
แต่ว่าต้องใช้งานจาก depedency ที่เรากำหนดนั่นเอง
แต่ไม่ใช่มีแค่ require นะ ยังมี exclude และ replace อีกด้วย

อยากรู้มากขึ้นไปดูที่

$go help modules

เพียงเท่านี้น่าจะพอทำให้เข้าใจมากขึ้นสำหรับ Go Module มากขึ้น
ว่าแล้วไปสร้าง Module และใช้งานกัน