顯示具有 golang 標籤的文章。 顯示所有文章
顯示具有 golang 標籤的文章。 顯示所有文章

2014年3月9日 星期日

golang 的 revel web framework 安裝與使用



要在 linux 下安裝 revel,要先設定環境變數,讓 go get 能夠將檔案下載到你指定的路徑

export GOPATH="/home/user/go"
export PATH="$PATH:$GOPATH/bin"

下載 revel
go get github.com/robfig/revel

編譯 revel

go get github.com/robfig/revel/revel

你可以用這個指令確定是否安裝成功

$ revel help

建立新應用程式

revel new myapp

注意:他是建立在 $GOPATH 的路徑上,而非當前目錄。輸出訊息會告訴你專案建在哪。

執行你的第一個程式

revel run myapp


有關 route 的資訊放在 conf/routes。內容依序為 method, path, function

GET     /                                       App.Index

App.Index 的程式碼大概長這樣。每個 Action 都會去找對應檔名的 view 來當 template。如下面程式碼會找 view 目錄下的 app/index.html 來當 template

package controllers

import "github.com/robfig/revel"

type App struct {
 *revel.Controller
}

func (c App) Index() revel.Result {
 return c.Render()
}

template 大概長這樣,這個 template 從 action 接受兩個參數,一個 name,一個 sum。

Hello, {{ .name }} {{ .sum }}

我們要傳資料到 template ,只要在 c.Render 裡放我們要的參數即可

func (c App) Index(name string, a int, b int) revel.Result {    sum := a + b return c.Render(name, sum)}

get/post method 的參數會被放在 action 相對應的參數裡。如 name=world&a=1&b=2,到 action 的話,變數 name是字串 world ,a 是整數1,b 是 整數2


如果你程式都寫完了,想要 deploy。用 

revel build import/path/to/app /tmp/app

之後你就可以到 /tmp/app ,用 ./run.sh 來跑 server 了。






2013年10月13日 星期日

浮點數除於零的行為

    程式語言中,整數除於零,基本上都會讓程式無法執行或是拋出類似例外的錯誤。可是如果是浮點數除於零的話,則行為就不一定。在 IEEE 754 的標準,浮點數除於零的話,會產生代表無窮大的值。c, c++, tcl, ruby, scala, java 遵循 IEEE 754。不過 perl, python , go 語言,發生浮點數除於零的情形,則是產生類似例外的訊息,而非給定無窮大的值。其他的語言沒有測試,這篇純粹紀錄各種語言的細微差異。

2013年8月20日 星期二

一個 golang 的非同步 stdin 的範例

    這篇文章只是一個簡單的例子,示範 golang 的 go 與 select 用法。 golang 原生就支援多序了,因此可以寫起來很簡潔。


2013年3月18日 星期一

比較c++、python、go、與javascript的 lambda語法

C++11 算是出了一段時間了,而最近編譯器對 C++11 的支持也越來越完善了。 C++11 有一個新特性,就是支援 lambda 的語法,所以就把一些語言的 lambda 語法拿來做比較。首先是python。

map(lambda s: s * s, [1, 2, 3])
python 的 lambda 語法很好理解,冒號前是參數,冒號後是程式碼。lambda   的限制就程式碼只能夠一行。lambda 可以存取外部變數,但是不能使用 assignment statement。

2013年2月12日 星期二

2013年2月8日 星期五

淺談 go 語言的defer關鍵字

在寫程式,我們時常犯一種錯誤,就是要了資源,忘了釋放。舉例來說,你 fopen 了檔案,卻沒有 fclose 。你 malloc 一塊記憶體,卻忘了 free 它。 你 acruire 一個 locker,卻忘了 release等等。記憶體管理也許可以藉由GC技術,而減輕許多負擔。但是另外兩種呢?

要怎麼減少犯錯的機會呢?盡量減少fopen和fclose之間的距離,越近越好。最好是fopen完就呼叫fclose,這樣犯錯的可能性就降低很多了。