33

开发了5年android,我开始了go学习之旅

 5 years ago
source link: https://studygolang.com/articles/16166?amp%3Butm_medium=referral
Go to the source link to view the article. You can view the picture content, updated content and better typesetting reading experience. If the link is broken, please click the button below to view the snapshot at that time.

奥术大师

做了近5年的android开发,最近项目也是不怎么忙,空闲的时候总会思考一些事情,不过作为移动开发,我个人觉得很有必要学习后台开发,由于公司是Go语言开发的,了解go语言一段时间后,我发现go语言的强大。基于优雅的语法和其强大的并发性,我开启我的go学习之旅。

golang强大的数据库驱动

Go与PHP不同的地方是Go没有官方提供数据库驱动,而是为开发者开发数据库驱动定义了一些标准接口,开发者可以

根据定义的接口来开发相应的数据库驱动,这样做有一个好处,只要按照标准接口开发的代码, 以后需要迁移数据

库时,不需要任何修改

不乱说用到MySQL还是sqlite3,都需要提前安装数据库驱动

sqlite3

32 位 windows 的安装

1、安装 sqlite3。到 http://www.sqlite.org/downloa... 的页面中,找到 sqlite-dll-win32-x86-3071700.zip 下载解压,并把里面的 dll 文件复制到 windows/system32 目录下。

2、下载 gcc 编译器。到 http://tdm-gcc.tdragon.net/do... ,下载 tdm-gcc-4.7.1-2。如果是 64 位的 win,下载 tdm64-gcc-4.7.1-3。运行这个 exe 文件,安装好 gcc 编译器。

3、运行命令:go get github.com/mattn/go-sqlite3 ,安装 go 的 sqlite3 的驱动等。

64 位 windows 的安装

1、下载 gcc 编译器。到 http://tdm-gcc.tdragon.net/do... ,下载 tdm64-gcc-4.7.1-3。运行这个 exe 文件,安装好 gcc 编译器。

2、运行命令:go get github.com/mattn/go-sqlite3 ,安装 go 的 sqlite3 的驱动等。

MySQL

下载:Go语言的 database/sql 包的一个 MySQL驱动。

地址: https://golang.org/pkg/databa...

github地址:

https://github.com/go-sql-dri...

官网地址:

http://godoc.org/github.com/g...

也可以在shell下面执行命令:

$ go get github.com/go-sql-driver/mysql

##### 开发阶段

https://github.com/Go-SQL-Driver/MySQL 支持database/sql,全部采用go写。
https://github.com/ziutek/mymysql 支持database/sql,也支持自定义的接口,全部采用go写。
https://github.com/Philio/GoMySQL 不支持database/sql,自定义接口,全部采用go写。

以MySQL为例:

##### 使用

sql包的用法简洁明了:

1、建立连接

首先是Open,

db, err := sql.Open(“mysql”, “user:password@/dbname”)

解释:

db 是一个*sql.DB类型的指针,在后面的操作中,都要用到db open之后,并没有与数据库建立实际的连接,与数据库建立实际的连接是通过Ping方法完成。此外,db应该在整个程序的生命周期中存在,也就是说,程序一启动,就通过Open获得db,直到程序结束,再Close db,而不是经常Open/Close。

err = db.Ping()

2、基本用法

DB的主要方法有:

  • Query 执行数据库的Query操作,例如一个Select语句,返回*Rows
  • QueryRow 执行数据库至多返回1行的Query操作,返回*Row
  • PrePare 准备一个数据库query操作,返回一个*Stmt,用于后续query或执行。这个Stmt可以被多次执行,或者并发执行
  • Exec 执行数不返回任何rows的据库语句,例如delete操作

Stmt的主要方法:

  • Exec
  • Query
  • QueryRow
  • Close

用法与DB类似

Rows的主要方法:

  • Cloumns: 返回[]string,column names
  • Scan:
  • Next:
  • Close:
详见:
http://golang.org/pkg/database/sql/
https://github.com/go-sql-driver/mysql/wiki/Examples
https://github.com/VividCortex/go-database-sql-tutorial

备注

Mysql的数据库开启方式:

1、打开任务管理器-->打开服务-->查找到服务名称为-->Mysql的服务-->启动就ok了。

2、Ctrl+R 输入cmd 。在你的Mysql配置好的情况下,你可以输入net start mysql命令

简单开发测试案例

//插入
func insert(db *sql.DB) {
    stmt, err := db.Prepare("INSERT INTO user(username, password) VALUES(?, ?)")
    defer stmt.Close()

    if err != nil {
        log.Println(err)
        return
    }
    stmt.Exec("guotie", "guotie")
    stmt.Exec("testuser", "123123")

}
var CURRENT_AGE = 20
var  sex   = "男"

//公共类,检查错误
func checkError(str  string,err error) bool{
    if err !=  nil{
        fmt.Printf(str+" %s \b \n",err.Error())
        panic(err)
        return false
    }
    return true
}

func main() {
    db, err := sql.Open("mysql", "root:yyh123@tcp(localhost:3306)/test?charset=utf8")
    checkError("打开一个 数据库",err)

    //创建数据库
    //createDataBase(db)
    //userDb(db)

    createTable(db)
    insertTableContent(db)
    queryFromDb(db)
    updataFromDb(db)
    //deleteFromTabCase(db)
    //dropTab(db)
}

//删除表
func dropTab(db *sql.DB) {
    res ,erro := db.Exec("drop table tb_user")
    if erro != nil{
        panic(erro)
    }
     affect,erro := res.RowsAffected()
     if erro != nil{
        checkError("删除表\n",erro)
    }
    fmt.Printf("\n删除表成功 ,结果影响的行数是:%d\n",affect)
}
//删除表周中数据
func deleteFromTabCase(db *sql.DB) {
     stmt ,err := db.Prepare("delete from tb_user where name = ?")
     checkError("根据条件进行删除表",err)

    res ,err :=  stmt.Exec("卡卡罗特")
    if err!= nil{
        panic(err)
    }

    affect, err := res.RowsAffected()
    lastId, err := res.LastInsertId()
    fmt.Printf("affect : %d   lasetId: %d",affect,lastId)
}
//更新数据
func updataFromDb(db *sql.DB) {
    stmt ,err := db.Prepare("update tb_user set name = ? where name = ?")
    checkError("查询条件数据库",err)
    result ,erro := stmt.Exec("卡卡罗特","yuer")
    if erro != nil{
        checkError("查询条件数据库",erro)
    }
    affect ,err := result.RowsAffected()
    checkError("查询的结果",err)
    fmt.Printf("更新的数据:%d",affect)
}

//查询数据
func queryFromDb(db *sql.DB) {
    row, error := db.Query("select * from tb_user")

     if checkError("查询数据库",error){
         defer  row.Close()
             for row.Next(){
                 var id int
                 var name string
                 var age int
                 var sex string
                 var addr string
                 var tel string
                 row.Scan(&id,&name,&age,&sex,&addr,&tel)

                 fmt.Printf("查询到了: id:  %d  %s %d  %s  %s  %s \n",id,name,age ,sex,addr,tel)
            }


     }
    //row, error := db.Query("select * from tb_user")
}



//增加:既插入数据
func insertTableContent(db *sql.DB) {
    //var userId int = utils.GetNowtimeMD5()
    stmt ,err := db.Prepare("insert   tb_user set id = ?, name = ? ,age = ?, sex = ?,addr = ?,tel=?;")
    //stmt, err := db.Prepare("insert userinfo set username=?,departname=?,created=?,password=?,uid=?")
    checkError("准备阶段,回准备要执行的sql操作,然后返回准备完毕的执行状态。",err)

    if CURRENT_AGE % 2 == 0{
        sex = "男"
    }else{
        sex = "女 "
    }
    CURRENT_AGE = CURRENT_AGE+utils.Generate_Randnum()
    result, err :=stmt.Exec(CURRENT_AGE,"yuer",CURRENT_AGE,sex,"河南省商水县等城镇林村","13011007869")
    if err != nil{
        panic(err)
    }
    fmt.Println("插入数据成功",result)
}

//创建表
func createTable(db *sql.DB) {
    _, err := db.Exec("CREATE TABLE IF NOT EXISTS tb_user(id int(10) primary key,name varchar(20),age int(10),sex varchar(5),addr varchar(64),tel varchar(11));")
    if err != nil {
        fmt.Println("create table  failed:", err.Error())
        return
    }
    fmt.Println("创建表成功啦~~")
    //第二种方式
    stmt, erro := db.Prepare(userDetail)
    if erro != nil {
        panic(erro)
    }

    _, err = stmt.Exec()
    if err != nil {
        panic(err)
    }
}

func main1() {
    db, err := sql.Open("mysql", "root:yyh123@tcp(10.2.0.215:3306)/test?charset=utf8")
    if err != nil {
        log.Fatalf("Open database error: %s\n", err)
    }
    defer db.Close()

    err = db.Ping()
    if err != nil {
        log.Fatal(err)
    }

    insert(db)

    rows, err := db.Query("select id, username from user where id = ?", 1)
    if err != nil {
        log.Println(err)
    }

    defer rows.Close()
    var id int
    var name string
    for rows.Next() {
        err := rows.Scan(&id, &name)
        if err != nil {
            log.Fatal(err)
        }
        log.Println(id, name)
    }

    err = rows.Err()
    if err != nil {
        log.Fatal(err)
    }
}

总结

今天的总结go开发的冰山一角,接下来还需要学习很多。之所以学Go,公司的需要以及自己考虑到今后的职业规划,虽然目前还是一Android开发为主,不过个人的精力很多时候放到了go上面自己也建立的有微信交流群,,如果你也有兴趣,可以一起来探讨go。

阅读更多

除程序员,除了写好代码,你更应该学会这些!

Android:四大架构的优缺点,你真的了解吗?

体验golang语言的风骚编程

NDK项目实战—高仿360手机助手之卸载监听

相信自己,没有做不到的,只有想不到的

在这里获得的不仅仅是技术!

1460000016979472


About Joyk


Aggregate valuable and interesting links.
Joyk means Joy of geeK