文档章节

Golang变量赋值的坑

隔夜卡布奇诺_
 隔夜卡布奇诺_
发布于 2016/06/13 23:21
字数 419
阅读 55
收藏 0
package main

import (
	"database/sql"
	_ "github.com/go-sql-driver/mysql"
	"log"
)

var db *sql.DB

func main() {

	//数据存在校验
	rows, err := db.Query("SELECT uuid FROM account WHERE username=?", "1")
	if err != nil {
		log.Println("QUERY ERROR: ", err)
	}
	defer rows.Close()

	var uuid string

	for rows.Next() {
		err := rows.Scan(&uuid)
		if err != nil {
			log.Fatal("SCAN ERROR: ", err)
		}
		log.Println("UUID: ", uuid)
	}

	err = rows.Err()
	if err != nil {
		log.Fatal("ROWS ERROR", err)
	}
}

func init() {

	//初始化数据库连接池
	db, err := sql.Open("mysql", "root:123456@tcp(127.0.0.1:3306)/loginserver?charset=utf8&loc=Asia%2FShanghai")
	if err != nil {
		log.Fatalln("DB CONNECT: ", err)
	}
	db.SetMaxOpenConns(200)
	db.SetMaxIdleConns(5)
	err = db.Ping()
	if err != nil {
		log.Fatalln("DB PING: ", err)
	}
}

编译通过,运行的时候爆出异常

panic: runtime error: invalid memory address or nil pointer dereference
[signal 0xc0000005 code=0x1 addr=0x0 pc=0x465ab0]

goroutine 1 [running]:
panic(0x661d60, 0xc082002080)
        C:/Go/src/runtime/panic.go:481 +0x3f4
database/sql.(*DB).conn(0x0, 0x1, 0xc082002e80, 0x0, 0x0)
        C:/Go/src/database/sql/sql.go:778 +0xad0
database/sql.(*DB).query(0x0, 0x6f37a0, 0x29, 0xc08205de50, 0x1, 0x1, 0x1, 0x0, 0x0, 0x0)
        C:/Go/src/database/sql/sql.go:1073 +0x4d
database/sql.(*DB).Query(0x0, 0x6f37a0, 0x29, 0xc08205de50, 0x1, 0x1, 0x10000c08205de10, 0x0, 0x0)
        C:/Go/src/database/sql/sql.go:1061 +0xaa
main.main()
        D:/Work/Project/golang/src/MySQLStudy/main.go:14 +0x1e1

调试的时候发现,程序到main方法中的时候db为nil,空的

在网上查问题的时候看到http://tonybai.com/2015/01/13/a-hole-about-variable-scope-in-golang/《一个有关Golang变量作用域的坑》 ,关于“:=”的问题, ":=" 使得init方法中的db的值没有作用到全局变量db中。

修改后正常

package main

import (
	"database/sql"
	_ "github.com/go-sql-driver/mysql"
	"log"
)

var db *sql.DB

func main() {

	//数据存在校验
	rows, err := db.Query("SELECT uuid FROM account WHERE username=?", "1")
	if err != nil {
		log.Println("QUERY ERROR: ", err)
	}
	defer rows.Close()

	var uuid string

	for rows.Next() {
		err := rows.Scan(&uuid)
		if err != nil {
			log.Fatal("SCAN ERROR: ", err)
		}
		log.Println("UUID: ", uuid)
	}

	err = rows.Err()
	if err != nil {
		log.Fatal("ROWS ERROR", err)
	}
}

func init() {

	//初始化数据库连接池
	db, _ = sql.Open("mysql", "root:123456@tcp(127.0.0.1:3306)/loginserver?charset=utf8&loc=Asia%2FShanghai")
	db.SetMaxOpenConns(200)
	db.SetMaxIdleConns(5)
	err := db.Ping()
	if err != nil {
		log.Fatalln("DB PING: ", err)
	}
}

 

© 著作权归作者所有

共有 人打赏支持
隔夜卡布奇诺_
粉丝 0
博文 4
码字总数 626
作品 0
闵行
CTO(技术副总裁)
go语言入门【基本类型和语法 一】

GOLANG 入门,废话不说,要知道它是什么,自己百度谷歌就OK的啦 首先,安装环境 本人的测试环境是centos7下载编译后版本加入到环境变量即可GO有个坑的地方是对gopath的设置,类似于JAVA的CLA...

o0无忧亦无怖
2016/07/25
36
0
golang: 详解interface和nil

golang的nil在概念上和其它语言的null、None、nil、NULL一样,都指代零值或空值。nil是预先说明的标识符,也即通常意义上的关键字。在golang中,nil只能赋值给指针、channel、func、interfa...

陈亦
2014/01/19
0
29
go语言文件汇总

归并排序及go语言实现 堆排序算法及go语言实现 Go语言基础学习(一)变量 【Leetcode】:Counting Bits问题 in Go语言 基于go语言的心跳响应 【Leetcode】:Single Number III问题 in Go语言 ...

d_watson
2016/04/15
127
2
Golang 基础:变量

声明一个变量 语法: 语句 声明了一个名为 类型为 的变量。我们还没有为变量分配任何值。如果一个变量没有被赋值,golang 会自动用变量类型的零值初始化它。在这种情况下, 被赋值为 0。 声明...

与蟒唯舞
2017/11/27
0
0
golang入门学习笔记(一)

作者: 一字马胡 转载标志 【2017-11-21】 更新日志 日期 更新内容 备注 2017-11-21 新建文章 go语言入门笔记(一) 准备环境 在Mac下,可以使用下面的命令安装golang: 完成安装之后,可以命...

一字马胡
2017/11/21
0
0

没有更多内容

加载失败,请刷新页面

加载更多

20180925 df与du命令、fdisk磁盘分区

df 命令 disk filesystem的缩写,查看已挂载磁盘的总容量、使用容量、剩余容量信息。 [root@centos01 ~]# dfFilesystem 1K-blocks Used Available Use% Mounted on/dev/sda3 27...

野雪球
33分钟前
1
0
Shell编程(expect同步文件、指定host和同步文件、构建文件分发系统、批量执行命令)

expect脚本同步文件 需求:自动同步文件 实验准备: A机器:192.168.248.130 B机器:192.168.248.129 实现: 1.A机器编写4.expect脚本文件,内容如下所示: #!/usr/bin/expectset passwd "...

蛋黄_Yolks
59分钟前
2
0
ppwjs之bootstrap颜色:背景颜色

<!DOCTYPT html><html><head><meta http-equiv="content-type" content="text/html; charset=utf-8" /><title>ppwjs欢迎您</title><link rel="icon" href="/favicon.ico" ......

ppwjs
今天
1
0
Ubuntu与 Fedora之对比

大家好。今天我将重点介绍两个流行的Linux发行版之间的一些特性和差异; Ubuntu 18.04和Fedora 28。它们都有自己的包管理; Ubuntu使用DEB,而Fedora使用RPM,但它们都具有相同的桌面环境(GNO...

linuxprobe16
今天
2
0
线性代数入门

线性代数的概念对于理解机器学习背后的原理非常重要,尤其是在深度学习领域中。它可以帮助我们更好地理解算法内部到底是怎么运行的,借此,我们就能够更好的做出决策。所以,如果你真的希望了...

牛奋Debug
昨天
3
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部