golang基础:常用类型转换,单元测试,数据库事务,细节 | 青训营笔记

151 阅读2分钟

这是我参与「第三届青训营 -后端场」笔记创作活动的第11篇笔记;

常用类型转换

无疑是int与string之间的转化,如下:

  • string转成int:
  • int, err := strconv.Atoi(string)
  • string转成int64:
  • int64, err := strconv.ParseInt(string, 10, 64)
  • int转成string:
  • string := strconv.Itoa(int)
  • int64转成string:
  • string := strconv.FormatInt(int64,10)
  • 以备查询

单元测试

当测试时需要导入某些比如yaml配置文件时,测试的话需要进行以下操作(比如连数据库进行某些操作,而连接数据库的配置是通过yaml配置的,还需要进行yaml解析以及初始化数据库链接等一些列操作):

func TestMain(t *testing.M) {//方法名必须为TestMain,且一个包内只能有一个此方法
   config.Init()
   Init()//这些是初始化方法,用来初始化各种解析数据操作而自定义的方法
   t.Run()//最后run运行
}
func TestXxxxxx(t *testing.T) {
......
}

数据库事务

当我们的数据库中主键设置了自增,我们想要插入数据的同时返回主键值供我们日后调用的话,我们需要这样做(golang不像java那样,成熟的框架已经直接自带了返回id的功能,我们需要先插入,然后进行查询id):

...
var ids []int    //插入数据并且返回id
tx := DB.Begin() //因为同时要插入数据兼返回主键,这里涉及两个数据库操作,所以这里要用手动事务
err := tx.Create(user).Error
if err != nil {
   tx.Rollback() //回滚
   return -1, errors.New("注册失败")
}
tx.Raw("select LAST_INSERT_ID() as id").Pluck("id", &ids)
tx.Commit() //提交
...

由于要进行两次sql操作,虽然有一次是查询操作,如果出错了确实对数据库没啥影响,但是这个id我们以后还要根据它进行各种操作,所以这个查出的id值是否正确也十分重要,所以这里用到了手动事务;

DB.Raw("select LAST_INSERT_ID() as id").Pluck("id", &ids)这里查出来的是一个切片,我们取第一个那就是我们刚插入的那行数据的id值;

其他细节

1、

当我们从数据库查询数据时如果查不到的话,这样:

err := DB.Where("id=?", id).Find(&user).Error

是不会报错的,也就是说正常情况下无论查到查不到这个err都是nil 所以这里不能靠这个err来判断是否查询到数据;

2、

Golang中我们向数据库插入时间类型数据(也就是说数据库中数据的类型是timestamp(6)时)我们可以这样做:

XxxTime = time.Now().Format("2006-01-02 15:04:05") //插入此格式的现在时间

3、errors.New("xxx")转换为string

当我们需要把错误信息返回给前台而前台约定错误信息是string字符串时,我们可以将errors.New("xxx")类型转换为转换为string,如下:

error1:=errors.New("xxx")
var error2 string=err.Error()//error2就是转换后的错误信息