文档章节

Golang变量赋值的坑

隔夜卡布奇诺_
 隔夜卡布奇诺_
发布于 2016/06/13 23:21
字数 419
阅读 33
收藏 0
点赞 0
评论 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 ⋅ 0

golang: 详解interface和nil

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

陈亦 ⋅ 2014/01/19 ⋅ 28

go语言文件汇总

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

d_watson ⋅ 2016/04/15 ⋅ 2

Golang 基础:变量

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

与蟒唯舞 ⋅ 2017/11/27 ⋅ 0

golang入门学习笔记(一)

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

一字马胡 ⋅ 2017/11/21 ⋅ 0

Golang 中的接口 (interface)

依赖于接口而不是实现,优先使用组合而不是继承,这是程序抽象的基本原则。Golang 中的 让编码更灵活、易扩展,使得 Go 拥有了面向对象多态的特性。在此我们记住三点就够了: 方法声明的集合...

hww_面条酱 ⋅ 2017/11/01 ⋅ 0

golang: 类型转换和类型断言

类型转换在程序设计中都是不可避免的问题。当然有一些语言将这个过程给模糊了,大多数时候开发者并不需要去关注这方面的问题。但是golang中的类型匹配是很严格的,不同的类型之间通常需要手动...

陈亦 ⋅ 2014/01/20 ⋅ 8

go笔记1-helloWorld

有一次听一个沙龙技术演讲,讲师说go是互联网时代的c,听了详细介绍以后感觉很赞,尤其是并行层面真正在语言层面上做了控制及特殊的内存管理机制等。。。 好吧,下面上先上helloWorld代码。(...

老范的自留地 ⋅ 2012/10/29 ⋅ 3

go学习笔记1--变量声明

Golang在变量声明、初始化以及赋值语句上照比C语言有了许多改进: a) 支持在同一行声明多个变量 var a, b, c int b) 支持在同一行初始化多个变量(不同类型也可以) var a, b, c = 5, "hell...

老范的自留地 ⋅ 2015/09/09 ⋅ 0

go学习笔记0-helloWorld

有一次听一个沙龙技术演讲,讲师说go是互联网时代的c,听了详细介绍以后感觉很赞,尤其是并行层面真正在语言层面上做了控制及特殊的内存管理机制等。。。 好吧,下面上先上helloWorld代码。(...

老范的自留地 ⋅ 2014/06/01 ⋅ 0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

Spring Boot整合模板引擎thymeleaf

项目结构 引入依赖pom.xml <!-- 引入 thymeleaf 模板依赖 --><dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-thymeleaf</artifactId......

yysue ⋅ 21分钟前 ⋅ 0

ConstraintLayout使用解析

AndroidStudio3.0创建Project默认的布局就是ConstraintLayout。 AndroidStudio3.0前的可以自己修改,使用ConstraintLayout。 为了要使用ConstraintLayout,我们需要在app/build.gradle文件中...

_OUTMAN_ ⋅ 33分钟前 ⋅ 0

OSChina 周三乱弹 —— 这样的女人私生活太混乱了

Osc乱弹歌单(2018)请戳(这里) 【今日歌曲】 @ 胖达panda :你经历过体验到人生的大起大落吗?我一朋友在10秒内体验了,哈哈。@小小编辑 请点一首《almost lover》送给他。 《almost love...

小小编辑 ⋅ 今天 ⋅ 9

自己动手写一个单链表

文章有不当之处,欢迎指正,如果喜欢微信阅读,你也可以关注我的微信公众号:好好学java,获取优质学习资源。 一、概述 单向链表(单链表)是链表的一种,其特点是链表的链接方向是单向的,对...

公众号_好好学java ⋅ 今天 ⋅ 0

Centos7重置Mysql 8.0.1 root 密码

问题产生背景: 安装完 最新版的 mysql8.0.1后忘记了密码,向重置root密码;找了网上好多资料都不尽相同,根据自己的问题总结如下: 第一步:修改配置文件免密码登录mysql vim /etc/my.cnf 1...

豆花饭烧土豆 ⋅ 今天 ⋅ 0

熊掌号收录比例对于网站原创数据排名的影响[图]

从去年下半年开始,我在写博客了,因为我觉得业余写写博客也还是很不错的,但是从2017年下半年开始,百度已经推出了原创保护功能和熊掌号平台,为此,我也提交了不少以前的老数据,而这些历史...

原创小博客 ⋅ 今天 ⋅ 0

LVM讲解、磁盘故障小案例

LVM LVM就是动态卷管理,可以将多个硬盘和硬盘分区做成一个逻辑卷,并把这个逻辑卷作为一个整体来统一管理,动态对分区进行扩缩空间大小,安全快捷方便管理。 1.新建分区,更改类型为8e 即L...

蛋黄Yolks ⋅ 今天 ⋅ 0

Hadoop Yarn调度器的选择和使用

一、引言 Yarn在Hadoop的生态系统中担任了资源管理和任务调度的角色。在讨论其构造器之前先简单了解一下Yarn的架构。 上图是Yarn的基本架构,其中ResourceManager是整个架构的核心组件,它负...

p柯西 ⋅ 今天 ⋅ 0

uWSGI + Django @ Ubuntu

创建 Django App Project 创建后, 可以看到路径下有一个wsgi.py的问题 uWSGI运行 直接命令行运行 利用如下命令, 可直接访问 uwsgi --http :8080 --wsgi-file dj/wsgi.py 配置文件 & 运行 [u...

袁祾 ⋅ 今天 ⋅ 0

JVM堆的理解

在JVM中,我们经常提到的就是堆了,堆确实很重要,其实,除了堆之外,还有几个重要的模块,看下图: 大 多数情况下,我们并不需要关心JVM的底层,但是如果了解它的话,对于我们系统调优是非常...

不羁之后 ⋅ 昨天 ⋅ 0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

返回顶部
顶部