You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Go语言NATS客户端无法订阅问题求助

问题分析与解决

嘿,我来帮你排查下这个问题~首先明确说:用fmt.Printf把消息打印到终端是完全正确的,这不是导致订阅失效的原因,核心问题出在其他地方,我给你拆解下:

核心问题1:程序执行后立刻退出,没有保持运行

NATS的订阅是异步机制,你的main函数在调用nc.Subscribe之后就直接执行完毕了,整个程序直接退出,根本没机会等待和接收消息。

解决方法很简单,在main函数末尾加一段阻塞逻辑,让程序一直保持运行状态,比如用空的select{}(它会一直阻塞当前goroutine):

// 在Subscribe代码之后添加
fmt.Println("已成功订阅,等待消息中...")
select {} // 永久阻塞,保持程序运行

核心问题2:忽略了连接错误

你用nc, _ := nats.Connect(...)直接忽略了连接返回的错误,这会导致如果服务器地址无效、Token错误或者网络不通,程序连不上NATS服务器你都不知道,自然收不到消息。

一定要加上错误处理:

nc, err := nats.Connect(servers, nats.Token("TOKEN_KEY"))
if err != nil {
    fmt.Printf("连接NATS服务器失败: %v\n", err)
    return
}
defer nc.Close() // 建议加上,程序退出时自动关闭连接

潜在小问题:服务器地址的空格

你的servers字符串里,逗号后面带了空格(比如nats://URL:30401, nats://URL:30402),虽然NATS客户端大概率能处理,但最好去掉空格,避免潜在的地址解析问题:

servers := "nats://URL:30401,nats://URL:30402,nats://URL:30403"

修正后的完整代码

package main

import (
    "fmt"
    "github.com/nats-io/go-nats"
)

func main() {
    servers := "nats://URL:30401,nats://URL:30402,nats://URL:30403"
    nc, err := nats.Connect(servers, nats.Token("TOKEN_KEY"))
    if err != nil {
        fmt.Printf("连接NATS服务器失败: %v\n", err)
        return
    }
    defer nc.Close()

    // 订阅AAPL交易消息
    _, err = nc.Subscribe("T.AAPL", func(m *nats.Msg) {
        fmt.Printf("[TRADE] Received: %s\n", string(m.Data))
    })
    if err != nil {
        fmt.Printf("订阅主题失败: %v\n", err)
        return
    }

    nc.Flush()
    if err := nc.LastError(); err != nil {
        fmt.Println(err)
        return
    }

    fmt.Println("已成功订阅T.AAPL主题,等待消息...")
    select {} // 保持程序运行
}

总结一下:你的打印逻辑没问题,主要是程序没有阻塞运行,加上错误处理和阻塞代码后,应该就能正常接收并打印消息了。

内容的提问来源于stack exchange,提问作者blonc

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.27 06:42:40