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

使用Golang的fmt.Println时出现异常数字问题求助

问题分析与解决:Golang中JSON字符串末尾出现额外数字的原因及修复

问题根源

你遇到的末尾额外数字(82、36、53)其实是fmt.Printf函数的返回值——也就是每次调用Printf时写入标准输出的字节数。你的代码错误地把这些返回值又打印了出来,才导致JSON后面多了这些干扰数字。

错误代码拆解

看一下你代码里的关键问题点:

vv, _ := fmt.Printf("{\"v_pk\": %q", V_PK)
pp, _ := fmt.Printf(",\"server_addr\": %q", SERVER_ADDR)
kk, _ := fmt.Printf(",\"a_key\": %q}] ", A_KEY)
rstr, _ := fmt.Println(vv, pp, kk)
stringc := string(rstr)
fmt.Println(stringc)
  1. fmt.Printf的核心作用是直接把格式化内容输出到控制台,它的返回值是写入的字节数和错误信息。你用vv、pp、kk接收了这三个字节数(82、36、53就是对应三次Printf写入的字节数)。
  2. 之后你调用fmt.Println(vv, pp, kk)又把这三个数字输出了,这就是为什么JSON末尾会出现它们。
  3. 最后你把fmt.Println的返回值(又是一个字节数)转成字符串,这完全是错误的操作——因为fmt.Println返回的不是输出的内容,而是写入的字节数。

修复方案

要构建JSON字符串,你应该用fmt.Sprintf——它会返回格式化后的字符串,而不是直接输出到控制台。然后把这些字符串拼接起来,最后统一打印即可。

修正后的代码:

package main
import (
    "fmt"
    "strings"
)
var e = "[{8888a8558921d75ec8bc362efbe9a76b82ec002337534e9f06ce92cbf8c27c8888 localhost:3303 4d50f447-7c93-42df-a03e-89c09626950a}]"
func main() {
    tl := strings.Trim(e, "[{")
    tr := strings.Trim(tl, "}]")
    r := strings.TrimSpace(tr)
    s := strings.Fields(r)
    V_PK := s[0]
    SERVER_ADDR := s[1]
    A_KEY := s[2]
    
    // 用Sprintf构建各个部分的字符串(不会直接输出)
    part1 := fmt.Sprintf("{\"v_pk\": %q", V_PK)
    part2 := fmt.Sprintf(",\"server_addr\": %q", SERVER_ADDR)
    part3 := fmt.Sprintf(",\"a_key\": %q}]", A_KEY)
    
    // 拼接成完整的JSON字符串
    jsonStr := part1 + part2 + part3
    
    // 打印最终结果
    fmt.Println(jsonStr)
}

额外优化建议

如果要生成JSON,更规范且健壮的做法是用Go标准库的encoding/json包,通过结构体序列化来生成JSON,这样可以避免手动拼接字符串容易出错的问题。比如:

package main
import (
    "encoding/json"
    "fmt"
    "strings"
)

type Data struct {
    VPk        string `json:"v_pk"`
    ServerAddr string `json:"server_addr"`
    AKey       string `json:"a_key"`
}

var e = "[{8888a8558921d75ec8bc362efbe9a76b82ec002337534e9f06ce92cbf8c27c8888 localhost:3303 4d50f447-7c93-42df-a03e-89c09626950a}]"
func main() {
    tl := strings.Trim(e, "[{")
    tr := strings.Trim(tl, "}]")
    r := strings.TrimSpace(tr)
    s := strings.Fields(r)
    
    data := Data{
        VPk:        s[0],
        ServerAddr: s[1],
        AKey:       s[2],
    }
    
    // 序列化数组格式的JSON
    jsonBytes, err := json.Marshal([]Data{data})
    if err != nil {
        fmt.Println("JSON序列化失败:", err)
        return
    }
    
    fmt.Println(string(jsonBytes))
}

这种方式能自动处理引号、逗号等细节,还能在数据格式错误时返回明确的错误信息,更适合生产环境使用。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.09 12:22:31