Json 在Golang中使用fmt.Println时出现奇怪的数字
我是刚来Golang的新手,一直做得不错,但我有一个奇怪的问题,我以前在使用fmt时从未遇到过。这种奇怪的行为发生在我打印字符串时。在包含子字符串的字符串的末尾,它还打印出每个字符串的len,尽管数字不相加。有人能解释为什么会发生这种情况以及如何阻止它吗 非常感谢您的帮助 代码如下:Json 在Golang中使用fmt.Println时出现奇怪的数字,json,go,substring,Json,Go,Substring,我是刚来Golang的新手,一直做得不错,但我有一个奇怪的问题,我以前在使用fmt时从未遇到过。这种奇怪的行为发生在我打印字符串时。在包含子字符串的字符串的末尾,它还打印出每个字符串的len,尽管数字不相加。有人能解释为什么会发生这种情况以及如何阻止它吗 非常感谢您的帮助 代码如下: package main import ( "fmt" //"log" "strings" ) var e = "[
package main
import (
"fmt"
//"log"
"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]
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)
}
预期产出:
[{"v_pk": "8888a8558921d75ec8bc362efbe9a76b82ec002337534e9f06ce92cbf8c27c8888","server_addr": "localhost:3303","a_key": "4d50f447-7c93-42df-a03e-89c09626950a"}]
实际产量:
[{"v_pk": "8888a8558921d75ec8bc362efbe9a76b82ec002337534e9f06ce92cbf8c27c8888","server_addr": "localhost:3303","a_key": "4d50f447-7c93-42df-a03e-89c09626950a"}] 82 36 53
它到底为什么要在末端打印这些字符串长度?很明显,我正在尝试构建一个JSON字符串,因此在尝试将字符串导入JSON解释器时,末尾的这些数字是有问题的
再次感谢您的帮助 fmt.Printf返回写入的字节数。变量vv、pp、kk是这三个Printf调用写入的字节数,而打印的三个数字就是这些数字。请查看及其朋友fmt.Println。文件内容如下:
Printf根据格式说明符格式化并写入标准输出。它返回写入的字节数和遇到的任何写入错误
代码中的行
vv, _ := fmt.Printf("[{\"v_pk\": %q", V_PK)
将格式化字符串打印到标准输出,然后返回写入的字节数并将其存储在vv中。如果要将格式化字符串打印到标准输出,只需调用fmt.Printf并忽略输出:
package main
import (
"fmt"
//"log"
"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]
fmt.Printf("[{\"v_pk\": %q, \"server_addr\": %q, \"a_key\": %q}]\n", V_PK, SERVER_ADDR, A_KEY)
}
或者,如果要将格式化字符串存储到新字符串变量,请调用:
您可以签出一个工作版本
您可能还希望签出,它可以使用正确定义的结构为您进行解析和序列化:
package main
import (
"encoding/json"
"fmt"
)
func main() {
type Datum struct {
VPK string `json:"v_pk"`
Server string `json:"server_addr"`
AKey string `json:"a_key"`
}
data := []Datum{
{VPK: "8888a8558921d75ec8bc362efbe9a76b82ec002337534e9f06ce92cbf8c27c8888",
Server: "localhost:3303",
AKey: "4d50f447-7c93-42df-a03e-89c09626950a",
}}
json, err := json.MarshalIndent(data, "", " ")
if err != nil {
// deal with error
}
fmt.Println(string(json))
}
请访问查看谢谢您的快速回复。我更正了我的代码,并使用Sprintf,但最后一行使用了Println,这正好满足了我的需要。我的部分问题是,我有一个使用典型json.Unmarshal的结构,但是额外的字符导致了错误。现在我将把字符串指向一个可以正常工作的结构。再次感谢!谢谢你的快速回复,这让我好几个小时都发疯了
package main
import (
"encoding/json"
"fmt"
)
func main() {
type Datum struct {
VPK string `json:"v_pk"`
Server string `json:"server_addr"`
AKey string `json:"a_key"`
}
data := []Datum{
{VPK: "8888a8558921d75ec8bc362efbe9a76b82ec002337534e9f06ce92cbf8c27c8888",
Server: "localhost:3303",
AKey: "4d50f447-7c93-42df-a03e-89c09626950a",
}}
json, err := json.MarshalIndent(data, "", " ")
if err != nil {
// deal with error
}
fmt.Println(string(json))
}