前言:
最近開始深究Go的webframework martini.慢慢開始會寫更多的東西出來.
筆記:
以下敘述的方式,會根據我想要達成的目標依序紀錄一下:
[JSON] 解決martini JSON的資料解析(parse)
不論是Martini或是 http.Request原本基本都會是使用JSON.Unmarshall來處理.
這裏需要注意的是,跟當初在處理mongodb的資料一樣.變數的名稱不可以全部是小寫,但是json資料名稱需要全部都是小寫.
如果不小心把變數名稱全部打成小寫,會無法正確的Unmarshall資料.
type Response2 struct {
Page int `json:"page"`
Fruits []string `json:"fruits"`
}
str := `{"page": 1, "fruits": ["apple", "peach"]}`
res := &Response2{}
json.Unmarshal([]byte(str), &res)
fmt.Println(res)
fmt.Println(res.Fruits[0])
[martini-render] 關於martini 顯示json的顯示部份.原本encoding/json能處理大部分的事情.但是要能完整顯示http status code 與json內容的話.我還是選擇了martini-contrib/render
render.JSON(400, map[string]interface{}{"result": "success"})
[Martini map]接下來問題是,如何在各個martini handler中,去傳遞你要的變數或是如何把資料庫加入.
原本是應該要直接使用martini.Use(DB()) 然後再去接 DB 的起始martini.handler即可.參考這裡
但是想要做成可變動的資料庫格式(in-mem DB, mongodb 共存) 所以還是直接丟整個變數比較好.類似作法參考
var db SomeDB{}
//將變數透過martini 傳到各個handler
m.Map(&db)
...
//新增一個變數參數就可以使用
func someHandler(params martini.Params, r render.Render, db *SomeDB) {
....
}
相關文章:
Go Doc: Init function
Init是負責每個檔案的起始function,會比main()更早啟動.但是各個檔案的Init並沒有一定順序.
根據這份文件提到,他在整個程式中的順序會是:
變數起始
Import
Init
Go :Methods on structs
Build a RESTful API with Martini
Learning Go with Martini - Working with MongoDB
Simple App with Go, Martini, Gorp and MySQL
前言:
接下的時間可能會比較忙碌,盡量也會多花一點時間玩Go…
筆記:
[Golang] 關於一些實用的鏈結
如何優雅的處理伺服器遇到SIGNAL問題時候重啟: Graceful server restart with Go
關於Go 1.4 關於測試的新功能: My reason to be excited for Go 1.4
關於Golan許多工具的介紹: An incomplete list of Go tools
Go for the paranoid network programmer: 挺多講解許多網路工程師應該會用到關於Go的部分
Go Everyday: 一個連續寫了三個多月Go的工程師把他的心得整理一下,裡面也包含他常用的工具
My Thoughts on Martini: 一篇專門討論一些Go上面Martini缺點的網頁,當然主要也是推廣自家好用的web framework negroni
[Docker] 這個禮拜Docker.Taipei 有辦年末小聚.雖然沒辦法參加把相關文件收集一下:
Carl Su: Docker 發展近況簡報釋出,內容涵蓋 Machine, Swarm 和 Compose。
用docker開出desktop環境:DOCKER DESKTOP: YOUR DESKTOP OVER SSH RUNNING INSIDE OF A DOCKER CONTAINER
Docker.Taipei 年末小聚,現場錄影
zerotier: 可以將docker服務串接在一起
Docker Infra 架構簡介與實例: 可以做到cluster與分流的架構
[Python] 一些網路上看到的有用文章
[Python] IPython簡單使用技巧速記
透過Facebook傳送訊息 via Python
根據作者的說明如下: 可以做到 Graph API 無法做到的事,例如傳訊息至朋友或群組,也可以上傳照片,還可以接收訊息.所以可以用 Facebot 來寫一些通知功能,甚至是和你聊天的機器人.
[Google]透過經緯度顯示Google Map
經過這一篇stackoverflow問答可以查到詳細方式
http://maps.google.com/maps?z=12&t=m&q=loc:38.9419+-78.3020
z is the zoom level (1-20)
t is the map type (“m” map, “k” satellite, “h” hybrid, “p” terrain, “e” GoogleEarth)
q is the search query, if it is prefixed by loc: then google assumes it is a lat lon separated by a +
前言: 很基本的概念,是從RUST官方網頁在介紹他的記憶體管理的部分看到的.覺得是很有趣的vector與記憶體處理的問題,由於RUST有比對它的程式語言設計架構,於是很好奇地把其他手邊常用的程式語言找了一下相關的範例. 主要問題(C/C++/ObjectC) 主要是講解,說在vector裡面的記憶體管理其實有一些技巧.尤其是在push_back的部分,每次的push_back如果目前的大小超過他的容量,就會放棄目前的記憶體位址,而去建立一個新的vector記憶體.而原本的記憶體位置就沒使用變成了garbage. 如此一來會造成原本去參考v[0]的記憶體位置變成了garbage,而會crash. 這邊可以參考vector的push_back說明. 這裏在ObjectC與C/C++結果不同,他不會crash但是會沒值.(ObjectC原本設定概念) 在C/C++/ObjectC解決方式: 其實只要先把記憶體保留起來,就可以解決這樣的問題. vector.reserve(specific_size); #include #include #include int main(int argc, const char * argv[]) { //Init new vector here std::vector<std::string> v; //v.reserve(128); could resolve this issue, 128 is arbitrarily value. //Put first element "hello" v: "Hello" v.push_back("Hello"); // x refer to v[0] which is "Hello" std::string& x = v[0]; //Push new element but size will over capacity (default is zero, after first push become 1) //So whole memory will deprence and create new memory size =2 //Refer to http://en.cppreference.com/w/cpp/container/vector/push_back v.push_back("world"); // Old reference memory aleady become to garbage, so app crash (depends OS) std::cout << x; return 0; } </pre> **在RUST方面** - 根據[RUST官方網頁](http://www.rust-lang.org/)在介紹他的記憶體的管理方面,由於它定義兩種資料結構mutable 跟 let (這裏跟swift有點像).所以根據以下的程式碼,會造成編譯的時候不成功. fn main() { let mut v = vec![]; v.push("Hello"); //let x = &v[0]; Cannnot compile. because the mutable variable cannot assign to static value. let x = v[0].clone(); v.push("world"); println!("{}", x); } **在Python的部分** - 沒有找到比較像vector的資料結構,我使用list來使用.我也有用codeskulptor來查看[視覺化(Viz mode)](http://www.codeskulptor.org/viz/index.html)的結果. - 在python內有分成兩種方式來參照(reference),如果你參照的是unmutable通常是使用copy,如果是參照mutable就會使用bind.而且整個list變大也不會影響參照的變數....