Json 在Golang中使用fmt.Println时出现奇怪的数字

Json 在Golang中使用fmt.Println时出现奇怪的数字,json,go,substring,Json,Go,Substring,我是刚来Golang的新手,一直做得不错,但我有一个奇怪的问题,我以前在使用fmt时从未遇到过。这种奇怪的行为发生在我打印字符串时。在包含子字符串的字符串的末尾,它还打印出每个字符串的len,尽管数字不相加。有人能解释为什么会发生这种情况以及如何阻止它吗 非常感谢您的帮助 代码如下: package main import ( "fmt" //"log" "strings" ) var e = "[

我是刚来Golang的新手,一直做得不错,但我有一个奇怪的问题,我以前在使用fmt时从未遇到过。这种奇怪的行为发生在我打印字符串时。在包含子字符串的字符串的末尾,它还打印出每个字符串的len,尽管数字不相加。有人能解释为什么会发生这种情况以及如何阻止它吗

非常感谢您的帮助

代码如下:

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))
}