Go Programming Blueprints 讀書筆記(談到了nsq/mgo處理數據持久化,但是業務邏輯不夠複雜)
Go Programming Blueprints
- http.Handle("/", &templateHandler{filename: "chat.html"});
- http.Handle靜態方法?
帶參數的函數對象參數? 就是個普通的struct——爲什麼不需要new?
- go get github.com/gorilla/websocket(方便的包依賴管理!)
- Go語句不需要;標記結束
- TDD: 在未定義type struct以前若是已經存在?
- 控制流:這裏相似於Swift。if/for不需要加()
- 初始化/賦值(:=) vs (<-)chan流做輸出右輸入(放到左邊可以以爲是個單元運算?)
- map類型的特殊語法:map[keyType]valueType -->僅僅能以爲Go裏面map看成內置類型處理了
- 所以不需要像Java裏定義key對象類的equals/hashCode方法,也需要像C++是把map容器類做爲模板庫來實現(非語言特性)
- chan類型是否也可以以爲如此呢?
- 把chan/map放在類型的前面。有點Haskell的風格?
- chan可以以爲就是Go routine之間消息通訊的管道?每個chan裏面的消息必須說同一種類型?
- struct內的定義是join chan *client,但使用倒是 for { select { case client := <-r.join: ... } },編程風格太詭異了
- 僅僅能以爲Go裏面的*把表明指針類型,應該理解爲引用?並且訪問其成員使用.而不是->
- 這裏的for-select彷佛借鑑了Erlang的慣使用方法
- 建立chan:make(chan []byte) //不叫new叫make~
- 隨意參數:a ...interface{}
- 給struct定義(成員)方法?有點感受像是Objective-C。
。。php
- 認證:handler wrapper(設計模式)
- 處理文件上傳:file, header, err := req.FormFile("avatarFile") //文件保存在哪?multipart.File接口類型?
- data, err := ioutil.ReadAll(file)
- 接口應該越通用越好——但標準庫確保已經定義了所有常常使用的嗎?
- net/http包中內置的文件server:
- http.Handle("/avatars/", http.StripPrefix("/avatars/", http.FileServer(http.Dir("./avatars"))))
- bufio
- s := bufio.NewScanner(os.Stdin) //或許可用正則表達式進行掃描?
- for s.Scan() { ... s.Next() ... } //讓我老是想起了Java的StringTokenizer類
- os/exec:用管道鏈接多個進程
- exec.Command:nextCmd.Stdin = thisCmd.StdoutPipe(),而後挨個調用cmd對象的Start()方法並Wait()
- NSQ
- 安裝驅動:go get github.com/bitly/go-nsq
- 安裝MongoDB驅動:go get gopkg.in/mgo.v2
- mongod --dbpath ./db
- iter := db.DB("ballots").C("polls").Find(nil).Iter()
- TCP長鏈接
- netc, err := net.DialTimeout(netw, addr, 5*time.Second) //Go的命名真tm見鬼,dial?
- httpClient = &http.Client{
-
Transport: &http.Transport{
-
Dial: dial, //使用定製的dial方法(?)
-
}, }
- 環境變量:`env:"SP_TWITTER_KEY,required"`
- fmt.Println(reflect.TypeOf(struct{}{}).Size()) // =0
- stopchan <-chan struct{} //僅接受的channel?這樣的語法太詭異了,運算符可以是類型簽名的一部分
- 捕獲OS信號
- termChan := make(chan os.Signal, 1)
- signal.Notify(termChan, syscall.SIGINT, syscall.SIGTERM, syscall.SIGHUP)
- 實現RESTful API
- var vars map[*http.Request]map[string]interface{}
- var varsLock sync.RWMutex //Go裏面使用讀寫鎖。性能不會有問題嗎?
- 又見wrapper:func withAPIKey(fn http.HandlerFunc) http.HandlerFunc { ... //這裏已經使用了高階函數了(Python裝飾器?)
- withCORS(withVars(withData(db, withAPIKey(handlePolls)))))
- The Facade interface exposes a single Public method, which will return the public view of a struct
- q.Lat, _ = strconv.ParseFloat(req.URL.Query().Get("lat"), 64) //庫的API設計得很是簡潔
- var ZIP Archiver = (*zipper)(nil) //編譯器會運行接口類型一致性檢查
- var _ Interface = (*Implementation)(nil)
- if err := os.MkdirAll(filepath.Dir(dest), 0777); err != nil { ...
- DirHash:實質上是將文件夾轉換爲一個key string對象,用字符串的比較來取代了對文件夾屬性的比較(解耦合了)
- case <-time.After(time.Duration(*interval) * time.Second): ... //嗯?返回一個channel,此channel將發送指定的超時消息
- GOPATH //至關於Maven裏的repo概念。或者JAVA_HOME?
- go get code.google.com/p/go.tools/cmd/goimports //嗯?怎麼不是內置的
歡迎關注本站公眾號,獲取更多信息