运行transfer的main文件出错.

来源:9-8 编码实战: 异步转移文件测试+小结

阿斯顿_马丁

2019-04-14

老师好,
按照您视频中,在producer.go中,没有如下代码(仓库中有的)

// 如果异常关闭,会接收通知
var notifyClose chan *amqp.Error

//func init() {
//	// 是否开启异步转移功能,开启时才初始化rabbitMQ连接
//	if !config.AsyncTransferEnable {
//		return
//	}
//	if initChannel() {
//		channel.NotifyClose(notifyClose)
//	}
//	// 断线自动重连
//	go func() {
//		for {
//			select {
//			case msg := <-notifyClose:
//				conn = nil
//				channel = nil
//				log.Printf("onNotifyChannelClosed: %+v\n", msg)
//				initChannel()
//			}
//		}
//	}()
//}

但是如果我把这段代码注释掉,我运行main文件会出现如下错误:
加上这段代码,就运行正常(仓库中的代码同样)。请问为什么呢?

$ go run main.go
2019/04/14 14:29:54 开始监听转移任务队列
panic: runtime error: invalid memory address or nil pointer dereference
[signal 0xc0000005 code=0x0 addr=0x48 pc=0x5ad7e6]

goroutine 1 [running]:
github.com/streadway/amqp.(*Channel).Consume(0x0, 0x70c871, 0x16, 0x707b39, 0xc, 0x1, 0x0, 0xbf24d2
b8a08577ec, 0x1f, 0xc0000825c0)
        C:/GoExercise/src/github.com/streadway/amqp/channel.go:1075 +0x166
filestore_server/mq.StartConsume(0x70c871, 0x16, 0x707b39, 0xc, 0x71d5c0)
        C:/GoExercise/src/filestore_server/mq/consumer.go:13 +0x8b
main.main()
        C:/GoExercise/src/filestore_server/service/transfer/main.go:48 +0xa2
exit status 2

写回答

1回答

xiaomo

2019-04-14

同学你好,多谢指出, 这个问题的原因是rabbitMQ的连接没有初始化。抱歉是视频里漏了init()方法的演示,

最重要的步骤是:

func init() {
   // ...
   initChannel()
   // ...
}

通过内建的init方法,程序会在启动的时候调用initChannel()函数来初始化连接。

可以把我以上的代码拷过去尝试执行一下呢;仓库里init()方法里的剩下其他步骤主要是用于断线自动重连的。

0
2
qq_白澤_0
回复
阿斯顿_马丁
请问你是如何解决的?我碰到了同样的问题
2021-04-17
共2条回复

Go实战仿百度云盘-实现企业级分布式云存储系统

紧随“云时代”技术潮流,分布式云存储系统,做第一代云程序员

1077 学习 · 494 问题

查看课程