Indented flow is for erroes
无错误正常流程代码,将成为一条直线,而不是缩进代码:
package main
// 建议style
f, err := os.Open(path)
if err != nil {
// handle error 将错误的代码在这里提前处理掉
}
// do stuff 做一些事情
// 不建议的style
f, err := os.Open(path)
if err == nil {
// do stuff
}
// handle error
下面代码有什么问题?
func AuthenticeRequest(r *Request) error {
err := authentication(r.User) // 验证用户是否合法
if err != nil {
return err
}
return nil
}
// 改进版 减少了if err判断
func AuthenticeRequest(r *Request) error {
return authentication(r.User)
}
Eliminate error handling by eliminating errors
统计io.Reader
读取内容的行数
func CountLines(r io.Reader) (int, error) {
var (
br = bufio.NewReader(r)
lines int
err error
)
for {
_, err = br.ReadString('\n')
lines++ // 先lines++,因为如果有io.EOF,跳过就会少记录一行,所以先lines++再处理err
if err != nil {
break
}
}
if err != io.EOF {
return 0, err
}
return lines, nil
}
精简版:
func CountLines(r io.Reader) (int, error) {
sc := bufio.NewScanner(r) // 创建一个扫描器
lines := 0
for sc.Scan() {
// 如果还有下一行就返回true,否则返回false
lines++
}
return lines, sc.Err()
}
例子
type Header struct {
Key, Value string
}
type Status struct {
Code int
Reason string
}
// 返回HTTP请求,需要将其写到io.Wreiter对象
func WriteResponse(w io