请稍等 ...
×

采纳答案成功!

向帮助你的同学说点啥吧!感谢那些助人为乐的人

运行transfer的main文件出错.

老师好,
按照您视频中,在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回答

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

最重要的步骤是:

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

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

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

0 回复 有任何疑惑可以回复我~
  • 提问者 阿斯顿_马丁 #1
    非常感谢!可以了!谢谢老师!
    回复 有任何疑惑可以回复我~ 2019-04-14 20:09:05
  • qq_白澤_0 回复 提问者 阿斯顿_马丁 #2
    请问你是如何解决的?我碰到了同样的问题
    回复 有任何疑惑可以回复我~ 2021-04-17 15:45:45
问题已解决,确定采纳
还有疑问,暂不采纳
意见反馈 帮助中心 APP下载
官方微信