เริ่มต้น web application ด้วย golang

แนะนำภาษา golang

ยินดีต้อนรับสู่โลกของการพัฒนาด้วย ภาษา golang เนื่องเป็นภาษาใหม่ที่พัฒนาโดย google เพื่อใช้งานสำหรับรองรับการทำงานภายในขนาดใหญ่ ที่ต้องการความรวดเร็ว และเปิดให้เป็น open source สามารถใช้งาน golang เพื่อพัฒนาเป็น application ได้หลากหลาย

golang เป็น compiled language คล้ายกับภาษา C ทำให้มีความรวดเร็วในการทำงานมีจุดเด่นดังนี้

  • go มีคุณสมบัติ fast-compiled, garbage-collected, concurrent system

วิธีการติดตั้ง golang

ติดตั้งจาก web ของ golang โดยตรง

ให้เปิด เวป https://golang.org/dl/ และทำการ download package ตรงตาม os ที่ใช้งาน ในที่นี้ใช้ mac ก็ให้ download ไฟล์ go1.5.2.darwin-amd64.pkg และให้ทำการติดตั้ง ปรกติ

$ go version
go version go1.5.2 darwin/amd64

ติดตั้งด้วย GVM

GVM 1 คือเครื่อมือที่ใช้สำหรับการติดตั้ง ทำให้สามารถติดตั้ง go ได้หลาย version การทำงานคล้ายๆกับ rvm ในruby

bash < <(curl -s -S -L https://raw.githubusercontent.com/moovweb/gvm/master/binscripts/gvm-installer)

Cloning from https://github.com/moovweb/gvm.git to /Users/newton/.gvm
Created profile for existing install of Go at "/usr/local/Cellar/go/1.5.2/libexec"
Installed GVM v1.0.22

Please restart your terminal session or to get started right away run
 `source /Users/newton/.gvm/scripts/gvm`

จะมีการเขียน script ไว้ใน ~/.bash_profile

[[ -s "/Users/newton/.gvm/scripts/gvm" ]] && source "/Users/newton/.gvm/scripts/gvm"

หลังจากการติดตั้งจะมีคำสั่ง gvm ให้ใช้งานดังนี้ gvm listall เพื่อเรียกดู tag version ที่ต้องการ

$ gvm listall
...
   go1.5
   go1.5.1
   go1.5.2
   go1.5beta1
   go1.5beta2
   go1.5beta3
   go1.5rc1
   go1.6beta1
...

หากต้องการติดตั้งก็สามารถใช้คำสั่ง gvm install [tag] และ หากต้องการใช้งาน go1.5 จะต้องติดตั้ง go1.4 ก่อน ดังนี้

gvm install go1.4
gvm use go1.4
gvm install go1.5
gvm use go1.5

จะได้ผลลัพท์ดังนี้

$ gvm install go1.4
Downloading Go source...
Installing go1.4...
 * Compiling...
go1.4 successfully installed!

$ gvm use go1.4
Now using version go1.4

$ gvm install go1.5
Installing go1.5...
 * Compiling...
go1.5 successfully installed!
newton@ ~$ gvm use go1.5
Now using version go1.5

ทดสอบ version จะเห็นว่า ตำแหน่งของคำสั่ง go จะอยู่ที่ $HOME/.gvm

@ ~$ which go
/Users/newton/.gvm/gos/go1.5/bin/go
1. อ้างอิง gvm https://github.com/moovweb/gvm

ติดตั้งจาก package management ของ OS

สำหรับ mac

brew install go

สำหรับ ubuntu

sudo add-apt-repository ppa:gophers/go
sudo apt-get update
sudo apt-get install golang-stable

ทดสอบการใช้งาน

หลังจากที่ได้ติดตั้งเรียบร้อยแล้ว ต่อไปจะเป็นกำหนด workspace สำหรับการ build program โดยให้ทำการสร้าง directory เพื่อทำงาน ในที่จะตั้งชื่อว่า work ($HOME/gowork) และให้ทำการเพ่ิมค่าตัวแปรของ shell environment ชื่อ GOPATH ใน ~/.bash_profile ไว้ล่างสุด

$ mkdir ~/gowork
vi ~/.bash_profile
export GOPATH=$HOME/gowork
export GOBIN=$HOME/gowork/bin
source ~/.bash_profile

สร้าง folder src, bin, pkg ภายใต้ folder gowork

mkdir ~/gowork/{src,bin,pkg}

ตัวอย่าง1 สร้าง file ชื่อ hello.go ใน ~/gowork/src/hello.go

package main

import "fmt"

func main() {
    fmt.Printf("Hello, world.\n")
}

ให้ใช้คำสั่ง go install

$ go install  src/hello.go
$ tree .
.
├── bin
│   └── hello
├── pkg
└── src
    └── hello.go

run program ที่อยู่ภายใน bin เพื่อดูลัพท์

$ ./bin/hello
Hello, world.

ตัวอย่าง2 Package Directory

  • สร้าง package source file และ folder ดังนี้ $GOPATH/src/mymath/sqrt.go หมายความว่าชื่อ mymath จะทำหน้าที่เป็นชื่อ package name เหมือนกับชื่อของ folder ที่เก็บ source file ทุกครั้งที่มีสร้าง package ให้ทำการสร้าง folder ใหม่ทุกครั้งใน folder src เราสามารถสร้างชั้นย่อยๆได้ (multi-level) เช่นถ้าหากเราสร้าง folder github.com/user/abcpackage จะได้ว่าชื่อ packagename จะเป็นชื่อที่อยู่ใน folder ชั้นในสุด นั้นคือ abcpackage จากตัวอย่าง
//source code of $GOPATH/src/mymath/sqrt.go
package mymath

func Sqrt(x float64) float64 {
    z := 0.0
    for i := 0; i < 1000; i++ {
        z -= (z*z - x) / (2*x)
    }
    return z
}

เนื่องจากเราต้องการสร้าง package เพื่อที่จะสามารถถูกเรียกใช้ได้จากโปรแกรม main ที่อยู่ในfile อื่น ทำให้เราต้องขึ้นต้นบรรทัดด้วย package mymath ไม่ใช่ package main เหมือนตัวอย่างที่ผ่านมา

  • การ compile package ให้เราทำการย้ายไปยัง directory ของ package แล้ว ใช้คำสั่ง go install การสั่งคำสั่งนี้ ไม่ต้องตามด้วยชื่อของ package เช่น go install mymath
cd $GOPATH/src/mymath/
go install

gowork$ tree .
.
├── bin
├── pkg
│   └── darwin_amd64
│       └── mymath.a
└── src
    └── mymath
        └── sqrt.go

5 directories, 2 files

หลังจากการสั่ง compile เรียบร้อย จะได้ผลเก็บไว้ใน folder pkg/darwin_amd64/mymath.a (darwin คือ os ที่ทำงานอยู่ และ amd64 คือบอกว่าเป็นเครื่อง 64bit)

  • ต่อมาเป็นการสร้าง application ชื่อ mathapp เพื่อเรียกใช้งาน package โดยให้สร้าง folder ของ application ชื่อ mathapp ภายใน src และสร้าง file ชื่อ main.go ดังนี้
cd $GOPATH/src
mkdir mathapp
cd mathapp
vim main.go

มี code ดังนี้

//$GOPATH/src/mathapp/main.go source code

package main

import (
    "mymath"
    "fmt"
)

func main() {
    fmt.Printf("Hello, world Sqrt(2) = %v \n", mymath.Sqrt(2))
}
  • ย้ายไปยัง app directory และสั่ง go install
cd $GOPATH/src/mymath
go install 

cd $GOPATH
$ tree .
.
├── bin
│   └── mathapp
├── pkg
│   └── darwin_amd64
│       └── mymath.a
└── src
    ├── mathapp
    │   └── main.go
    └── mymath
        └── sqrt.go

run app จะได้ผลดังนี้

gowork$ ./bin/mathapp
Hello, world Sqrt(2) = 1.414213562373095