GoLang Startup
5/Oct 2013
最近看上了 golang 的速度跟整合 github 的模式
要來學一下 golang 了
Compiler and Runtime https://code.google.com/p/go/downloads/list
Debugger 參考 windows下用eclipse+goclipse插件+gdb搭建go語言開發調試環境
直接抓 liteide Download 來用裡面內建的 gdb
IDE (Eclipse) (其實LiteIDE比較好用)
- 下載 http://www.eclipse.org/downloads/
- 裝 plugin goclipse Update Site
- 設定 Preferences
另一個 IDE (LiteIDE)
- 下載 https://code.google.com/p/golangide/
- 設定環境變數, 不然自動補全的功能會失效
- GOARCH=amd64
- GOOS=windows
- GOROOT=C:\Go\
- GOPATH=C:\GoPath\
開個 test go project
package main import ( "fmt" ) func main() { fmt.Println("golang") }
大功告成!!
不過用 gdb 來 debug 頗難用
還是只好盡量寫小 function + unit test 吧…@_@
剛剛突然發現 liteide 還可以拿來寫 markdown 耶!!
參考資料
- https://github.com/astaxie/build-web-application-with-golang/blob/master/ebook/preface.md
- https://github.com/why404/gobook
- https://code.google.com/p/go-wiki/wiki/Projects
- http://golang.cat-v.org/pure-go-libs
- https://github.com/shaoshing/train
Memory Buffer
支援 io.Reader, io.Writer
b := new(bytes.Buffer)
Byte array to string
// var b []byte
string(b[0:])
Time to solr date format
time.Now().In(time.UTC).Format("2006-01-02T15:04:05.000Z")
Goroutine Example
import (
"fmt"
"runtime"
"time"
)
func Test_Goroutine() {
// 假設有這些資料需要處理
list := []int{5, 4, 3, 2, 1}
// worker 的數量設成 CPU 的數量好像比較有效率?
workernum := runtime.NumCPU()
// in, out 的 channel 可以換成要處理的 struct, 這邊用 string 來當示範
in, out := make(chan string, workernum), make(chan string, workernum)
for i := 0; i < workernum; i++ {
// 這個匿名函數就是真正要做事的地方
go func() {
// 一直從 in channel 抓資料來處理
for data := range in {
// 睡個一秒鐘來模擬做事 XD
time.Sleep(1000 * time.Millisecond)
// 資料處理完了送出去
out <- data
}
}()
}
// 開一個 goroutine 來把要處理的資料放進 in channel
go func() {
for _, data := range list {
in <- fmt.Sprint(data)
}
// 資料都塞進 channel 了, 可以關掉了, 不關好像也沒關係?
close(in)
}()
// 等所有的資料處理完再結束
for _ = range list {
<-out
}
}