Go Programming Blueprints 读书笔记(谈到了nsq/mgo处理数据持久化,可是业务逻辑不够复杂)
2017-05-02 14:10
477 查看
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。
。。
认证: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 //嗯?怎么不是内置的
相关文章推荐
- Go Programming Blueprints 读书笔记(谈到了nsq/mgo处理数据持久化,但是业务逻辑不够复杂)
- 当遇到处理复杂业务逻辑的情况,使用了hibernate,你是怎么处理的?
- 基于文件数据库的规则引擎处理海量高复杂度数据(一,业务背景)
- 用适配器模式处理复杂的UITableView中cell的业务逻辑
- MVC教程:MVC---View处理页面;Control处理业务逻辑;Model处理数据
- 业务逻辑较复杂时的数据分析方法(供初学者参考)
- 业务逻辑>数据层>SqlDataSource>处理sql命令执行错误
- 应对复杂的业务逻辑
- 如何处理日志和业务逻辑的困惑
- Markup之美,初学者应该处理好UI与业务逻辑间的关系
- 复杂检索数据并分页显示的处理方法
- 业务逻辑>数据层>SqlDataSource>sql的输入参数
- 业务逻辑>数据层>SqlDataSource>sql的输入输出参数>存储过程 输出参数
- 复杂检索数据并分页显示的处理方法
- 业务逻辑>数据层>ObjectDataSource>数据源分页机制
- 追求完美很容易在开发上过度设计 -- 树形结构的设计不仅带来了代码开发量更可怕的是处理相应的复杂逻辑
- 毕业设计超市系统(五)业务逻辑处理
- WCF+Ef实战系列二:EF实体的构建及数据业务层的处理
- 偶这个前端设计师有生以来写过的最复杂的程序业务逻辑(菜鸟贴)。
- WCF+Ef实战系列二:EF实体的构建及数据业务层的处理