Go Programming Blueprints 讀書筆記(談到了nsq/mgo處理資料持久化,但是商務邏輯不夠複雜)

來源:互聯網
上載者:User

標籤:goroutine   go   defer   chan   blueprints   

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

著作權聲明:本文為博主原創文章,未經博主允許不得轉載。

Go Programming Blueprints 讀書筆記(談到了nsq/mgo處理資料持久化,但是商務邏輯不夠複雜)

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.