Intelligence without ambition is a bird without wings.

2015-10-29
后台-域名

约定

  • 基础域名 base.com

域名配置相关

官网(配置www)

[www].基础域名

后台接口

[用途].[项目简称].api.[基础域名]

用途:

-   开发 `dev` `dev.app.api.base.com`
-   测试 `test` `test.app.api.base.com`
-   生产 为空 `app.api.base.com`

实例:

阅读此文

2015-10-29
scp

命令

scp [参数] [原路径] [目标路径]

选项

  • -P port

    指定远程端口(默认22)

实例

  • 拷贝远程文件到本地

    scp wallace@192.168.1.1:/opt/a .
    
阅读此文

2015-10-28
go-pointer

要点

  • 在访问filed时,pointer to struct会自动解引用

    1
    2
    3
    4
    5
    type person struct {
    name string
    }
    p := &person{"a"}
    p.name // <=> (*p).name
  • 在调用method时,struct(reciver)会自动转换(取地址,解引用)

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    type Dog struct {
    name string
    }

    func (d Dog) Bite(target string) {
    fmt.Printf("%v bite %v\n", d.name, target)
    }

    func (d *Dog) Drink(target string) {
    fmt.Printf("%v drink %v\n", d.name, target)
    }

    func main() {
    a := Dog{"a"}
    b := &Dog{"b"}
    a.Bite("b")
    b.Bite("a") // <=> (*b).Bite("a")

    a.Drink("water") // <=> (&a).Drink("water")
    b.Drink("beer") //
    }
  • function参数不会转换

参考

  1. http://stackoverflow.com/questions/20849751/rule-for-go-pointers-references-dereferencing
阅读此文

2015-10-28
go-make

要点

  • 专为用来创建slice,map,channel这3中类型

    • 因为这3中类型依赖于底层数据结构存储,所以必须初始化!
  • 返回T类型,而不是*T

参考

  1. https://golang.org/doc/effective_go.html#allocation_make
阅读此文

2015-10-28
go-内存分配

要点

  1. 在go中,变量定义时,存储到stack还是heap上,由编译器确定

    • 若该变量在离开该作用域,仍被其他引用访问到(通过指针),则存储到heap

实例

1
2
3
4
5
6
7
8
func f() *string {
var s string = "Hello world"
return &s
}
func main() {
r := f()
fmt.Printf("%T %v %v\n", r, r, *r)
}
  1. 与C/C++不同,在go中,可以返回函数内定义的变量地址(因为存储到heap中)

结论

  1. 在go中,不用关心变量存储位置

参考

  1. https://golang.org/doc/faq#stack_or_heap
  2. http://stackoverflow.com/questions/10866195/stack-vs-heap-allocation-of-structs-in-go-and-how-they-relate-to-garbage-collec?rq=1
阅读此文

2015-10-27
go-new

要点

  • 填充零值(不会进一步初始化),返回指针

  • 可用来简化定义内部类型(int, string…),因为&int是非法的

    1
    2
    3
    4
    i := new(int)

    var j int
    i = &j

参考

  1. https://golang.org/doc/effective_go.html#allocation_new
  2. http://stackoverflow.com/questions/9320862/go-why-would-i-make-or-new
  3. http://stackoverflow.com/questions/13244947/is-there-a-difference-between-new-and-regular-allocation?lq=1
阅读此文

2015-10-22
go-struct

要点

  1. 结构体指针用来实现类似C++的方法,通过指针才可以修改数据

    func (data *Data)
    
阅读此文

2015-10-21
go-net-http

http的几个数据结构

  • Request

    客户端发起的http请求,包含请求的URL(资源标识),方法,内容,cooike等

  • Response

    服务端发送的响应(HTTP头,辅助说明响应内容)

  • Conn

    客户端跟服务器的连接

  • Handler

    URL的处理逻辑

    1
    2
    3
    type Handler interface {
    ServeHTTP(ResponseWriter, *Request)
    }

工作流程

  1. 创建Listen Socket, 监听指定的端口, 等待客户端请求到来

  2. Listen Socket接受客户端的请求, 得到Client Socket, 接下来通过Client Socket与客户端通信

  3. 处理客户端的请求, 首先从Client Socket读取HTTP请求的协议头, 如果是POST方法, 还可能要读取客户端提交的数据, 然后交给相应的handler处理请求, handler处理完毕准备好客户端需要的数据, 通过Client Socket写给客户端

使用方法

  1. 通过http.HandleFunc(pattern string, handler func(ResponseWriter, *Request))处理指定请求(根据URL路由)

  2. 通过htpp.ListenAndServe(addr string, handler Handler)注册处理器

    • Handler实现了http.ServeHTTP(ResponseWriter, *Request)接口

    • 该接口根据URL,请求参数等来路由,比如jsonrpc中根据method来路由

  3. 通过http.Handle(pattern string, handler Handler)注册处理器

阅读此文

2015-10-21
mysql-limit

说明

limit [M,]N

  • M:偏移量,第M+1条

  • N:数量

功能

  1. 获取指定数目列

    select * from t_stock_base limit 1;
    
  2. 获取排序结果中的指定序号,指定书目列

    select * from t_stock_base order by stockid limit 1,2;
    
阅读此文

2015-10-21
mysql-查询技巧

  1. 关联查询时,使用INNER JOIN <table> USING (<column>)

    • select结果列,去除了关联列,避免了使用a.column
阅读此文