文档章节

Golang变量赋值的坑

隔夜卡布奇诺_
 隔夜卡布奇诺_
发布于 2016/06/13 23:21
字数 419
阅读 82
收藏 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

没有更多内容

加载失败,请刷新页面

加载更多

http协议请求头的意义

GET /day31_Http_306/index.jsp HTTP/1.1: GET请求,请求服务器路径为/hello/index.jsp,协议为1.1 请求头 1.Host:localhost:请求的主机名为localhost2.User-Agent:Mozilla/5.0(Windows NT......

潇潇程序缘
35分钟前
6
0
Netty 简单服务器 (三)

经过对Netty的基础认识,设计模型的初步了解,来写个测试,试试手感 上篇也说到官方推荐我们使用主从线程池模型,那就选择这个模型进行操作 需要操作的步骤: 需要构建两个主从线程组 写一个服务器...

_大侠__
46分钟前
8
0
day02:管道符、shell及环境变量

1、管道符:"|" 用于将前一个指令的输出作为后一个指令的输入,且管道符后面跟的是命令(针对文档的操作):cat less head tail grep cut sort wc uniq tee tr split sed awk等) [root@localho...

芬野de博客
56分钟前
15
0
Kubernetes系列——Kubernetes 组件、对象(二)

一、Kubernetes 组件 介绍了Kubernetes集群所需的各种二进制组件。 Master 组件 Master组件提供集群的管理控制中心。Master组件可以在集群中任何节点上运行。但是为了简单起见,通常在一...

吴伟祥
今天
17
0
Flink-数据流编程模型

1、抽象等级 Flink提供了不同级别的抽象来开发流/批处理应用程序。 1) 低层级的抽象 最低层次的抽象仅仅提供有状态流。它通过Process函数嵌入到DataStream API中。它允许用户自由地处理来自一...

liwei2000
今天
15
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部