最近闲余时间接触了一点GO,真不知道它好用在哪,在Go语言中没有类(Class)的概念,然而编程又离不开面向对象,于是GO说我没有类的概念,但我也能实现面向对象编程。在Go中使用结构体(Structs)对属性进行封装,结构体就像是类的一种简化形式。然后再在Go中定义一些方法并且作用在接收者(receiver)上的一个函数,简单描述就是GO中没有类的概念,但你可以定义一个Struct结构,当作类。这个结构中的属性当做类的属性,然后单独定义一些方法挂载到这个结构上,模拟出了一个类。但感觉还是挺别扭的。本文地址:http://www.04007.cn/article/779.html,未经许可,不得转载.
而在使用GO语言连接数据库查询数据时,又感觉到好繁琐。连接MYSQL查出数据,然后使用GO进行循环迭代都不是一个容易的事,实现如下:本文地址:http://www.04007.cn/article/779.html,未经许可,不得转载.
#GO中的控制器 package controllers import ( "database/sql" "fmt" "github.com/astaxie/beego" _ "github.com/go-sql-driver/mysql" ) type MainController struct { beego.Controller } #连接MYSQL读取数据 func (c *MainController) Get() { #连接MYSQL db, err := sql.Open("mysql", "test:test@tcp(10.15.80.74:3307)/database_name?charset=utf8") #查询数据库 rows, _ := db.Query("SELECT id,title,updateTime FROM article") #第一种方式把数据处理好用的二维map cols, _ := rows.Columns() vals := make([][]byte, len(cols)) scans := make([]interface{}, len(cols)) for k, _ := range vals { scans[k] = &vals[k] } i := 0 result := make(map[int]map[string]string) for rows.Next() { rows.Scan(scans...) row := make(map[string]string) for k, v := range vals { key := cols[k] row[key] = string(v) } result[i] = row i++ } fmt.Println(result) #第二种方式直接scan数据中的字段,但字段必须一一对应,不能疏漏。 id := 0 title := "" updateTime := 0 var enterprise []type = make([]type, 15) for rows.Next() { rows.Scan(&id, &title, &updateTime) fmt.Println(id, title, updateTime) } db.Close() }本文地址:http://www.04007.cn/article/779.html,未经许可,不得转载.
第一种方式的实现应该是我们需要的普遍好用的方式,但GO实现起来感觉有点费力,取某一行的数据时必须来指定列名,且和查出来的数据要一一对应,所以要做成通用的取数据办法就必须需要先扫出列名,然后循环根据列名scan取得一行记录的各个值。第二种方式比较快,但在scan的时候必须先要定义好变量,并且指定变量来取得值,这个时候如果数据表中增加一个字段,整个都需要改动,感觉有点麻烦啊。本文地址:http://www.04007.cn/article/779.html,未经许可,不得转载.
本文地址:http://www.04007.cn/article/779.html 未经许可,不得转载. 手机访问本页请扫描右下方二维码.
![]() |
![]() |
手机扫码直接打开本页面 |