0x00 引言

再简单的事情,也需要有人去做。

0x01 代码

  1. package main
  2. import (
  3. "database/sql"
  4. "fmt"
  5. _ "github.com/mattn/go-sqlite3"
  6. "os"
  7. )
  8. func main() {
  9. type Person struct {
  10. name string
  11. age int
  12. }
  13. person := Person{"mike",18}
  14. fmt.Println(person)
  15. os.Remove("./foo.db")
  16. db, err := sql.Open("sqlite3", "./foo.db")
  17. checkErr(err)
  18. defer db.Close()
  19. //插入数据
  20. _, err = db.Exec("create table userinfo (uid text not null primary key, username text, departname text, created text)")
  21. checkErr(err)
  22. stmt, err := db.Prepare("INSERT INTO userinfo(uid, username, departname, created) values(?,?,?,?)")
  23. checkErr(err)
  24. defer stmt.Close()
  25. res, err := stmt.Exec("1", "astaxie", "研发部门", "2012-12-09")
  26. checkErr(err)
  27. id, err := res.LastInsertId()
  28. checkErr(err)
  29. fmt.Println(id)
  30. //更新数据
  31. stmt, err = db.Prepare("update userinfo set username=? where uid=?")
  32. checkErr(err)
  33. defer stmt.Close()
  34. res, err = stmt.Exec("astaxieupdate", id)
  35. checkErr(err)
  36. affect, err := res.RowsAffected()
  37. checkErr(err)
  38. fmt.Println(affect)
  39. //查询数据
  40. rows, err := db.Query("SELECT * FROM userinfo")
  41. checkErr(err)
  42. defer rows.Close()
  43. for rows.Next() {
  44. var uid int
  45. var username string
  46. var department string
  47. var created string
  48. err = rows.Scan(&uid, &username, &department, &created)
  49. checkErr(err)
  50. fmt.Println(uid)
  51. fmt.Println(username)
  52. fmt.Println(department)
  53. fmt.Println(created)
  54. }
  55. //删除数据
  56. stmt, err = db.Prepare("delete from userinfo where uid=?")
  57. checkErr(err)
  58. defer stmt.Close()
  59. res, err = stmt.Exec(id)
  60. checkErr(err)
  61. affect, err = res.RowsAffected()
  62. checkErr(err)
  63. fmt.Println(affect)
  64. db.Close()
  65. }
  66. func checkErr(err error) {
  67. if err != nil {
  68. panic(err)
  69. }
  70. }

0x02 错误处理

Golang 的这种检查错误的代码太多了,过度重复,一点都不优雅。Golang 2 对这种情况进行了改善。draft 给出的例子如下:

  1. func main() {
  2. hex, err := ioutil.ReadAll(os.Stdin)
  3. if err != nil {
  4. log.Fatal(err)
  5. }
  6. data, err := parseHexdump(string(hex))
  7. if err != nil {
  8. log.Fatal(err)
  9. }
  10. os.Stdout.Write(data)
  11. }

Golang 2的写法如下:

  1. func main() {
  2. handle err {
  3. log.Fatal(err)
  4. }
  5. hex := check ioutil.ReadAll(os.Stdin)
  6. data := check parseHexdump(string(hex))
  7. os.Stdout.Write(data)
  8. }

0x03 UPDATE

  1. 2019-01-15