使用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)
fmt.Printf的核心作用是直接把格式化内容输出到控制台,它的返回值是写入的字节数和错误信息。你用vv、pp、kk接收了这三个字节数(82、36、53就是对应三次Printf写入的字节数)。- 之后你调用
fmt.Println(vv, pp, kk)又把这三个数字输出了,这就是为什么JSON末尾会出现它们。 - 最后你把
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
相关产品推荐
相关产品推荐

