Intelligence without ambition is a bird without wings.

2015-09-24
app后台-升级经验

  • 使用git-flow开发

  • 文档化升级步骤

  • 每个新版本开发时,用升级文档记录下,涉及到的数据库更新,配置文件更新,部署环境更新等操作

阅读此文

2015-09-24
go-error

要点

  • error是一个预定义的interface

    1
    2
    3
    type error interface {
    Error() string
    }
  • 最常用的一个实现是errors中的errorString

    1
    errors.New("error message")
  • fmt包中,通过反射得知是error类型时,则调用error() string方法

  • fmt包中,提供了Errorf(format string, a ...interface{}) error来方便错误信息输出

  • 在精细化的情况下(调用者需要知道错误(该错误是重新定义的的,包含其他信息)的详细信息,不只是错误字符串),
    这时可以通过类型断言来单独处理指定错误

    1
    2
    3
    4
    5
    6
    7
    if err := dec.Decode(&val); err != nil {
    if serr, ok := err.(*json.SyntaxError); ok {
    line, col := findLine(f, serr.Offset)
    return fmt.Errorf("%s:%d:%d: %v", f.Name(), line, col, err)
    }
    return err
    }
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10

    _, err := my.DB.Exec(sql)
    if err != nil {
    if driverErr, ok := err.(*mysql.MySQLError); ok { // Now the error number is accessible directly
    if driverErr.Number == 1062 {
    return errDuplicate
    }
    }
    return &json2.Error{Code: 100, Message: "a"}
    }

参考

  1. http://blog.golang.org/error-handling-and-go
阅读此文

2015-09-23
go-http中获取客户端IP

阅读此文

2015-09-23
go-string操作

  • 字符串分割

    func SplitAfter(s, sep string) []string
    
阅读此文

2015-09-23
app开发-认证

阅读此文

2015-09-23
go-int与string转换

int => string

第一种: strconv.Itoa(10)

第二种: fmt.Sprintf(“%d”, 10)

第三种: fmt.Sprint(10)

阅读此文

2015-09-23
go-import

正则文法

ImportDecl       = "import" ( ImportSpec | "(" { ImportSpec ";" } ")" ) .
ImportSpec       = [ "." | PackageName ] ImportPath .
ImportPath       = string_lit .

导入路径(ImportPath)

  • 相对路径
1
import "./test"
  • 绝对路径(gopath)
1
import "fmt"

包名(PackageName)

  • .
1
import . "fmt"

这样导入后,在使用的时候无须包名

  • _
1
import _ "github.com/go-sql-driver/mysql"

不直接使用该包内的导出标识符

  • 别名
1
import f "fmt"

通过别名访问(“f.Println”)

  • 默认形式
1
import "fmt"

参考

  1. https://golang.org/ref/spec#Import_declarations
阅读此文

2015-09-22
产品部署目录

部署目录结构

部署目录 := 起始目录/项目名称/版本号/构建类型

构建类型 := 开发 | 测试 | 生产

开发 := debug

测试 := test

生产 := release

cmake

1
${PROJECT_NAME}/${PROJECT_VERSION}/${CMAKE_BUILD_TYPE}

cmake

阅读此文

2015-09-22
程序配置数据用文件还是数据库

对比

| 对比点 | 文件 | 数据库 |
|——————–+———————-+———-|
| 程序实现 | 简单 | 相对复杂 |
| 数据读写操作 | 简单 | 相对复杂 |
| 是否利于版本回退 | 是(可以纳入版本控制) | 否 |
| 部署是否方便 | 是 | 否 |
| 是否方便集中式管理 | 否 | 是 |

结论

综合考虑,优先使用配置文件方式

参考

  1. Storing config data - RDBMS vs File?
  2. Should I use a config file or database for storing business rules?
阅读此文

2015-09-21
go-library

阅读此文