我是Go的新手,无法弄清楚如何打印出我创建的JSON。我正在使用“encoding / json”并且返回了一个[]字节。但是当我打印出来时,我得到了:
cannot use json_msg (type []byte) as type string in function argument
收到此消息后,我试图将[]字节数组转换为字符串或空接口。但是我似乎无法让它发挥作用。有任何想法吗?相关代码如下:
type Message struct {
Id int
Name string
}
for _, row := range rows {
m := Message{row.Int(0), row.Str(1)}
json_msg, err := json.Marshal(m)
if err == nil {
panic(err)
}//if
//tried below to print out a interface, didn't work either
//var f interface{}
//err = json.Unmarshal(json_msg, &f)
fmt.Fprintf(c.ResponseWriter, json_msg)
}//for
答案 0 :(得分:11)
有一些方法可以获得你想要的东西。
首先,直接回答您的问题,fmt.Fprintf
,如果类型为func(io.Writer, string, ...interface{})
。由于你将c.ResponseWriter
传递给它,我认为这是满足io.Writer
的东西。 fmt.Fprintf
的第二个参数是格式字符串。如果你想打印一些字符串,你可以使用%s
格式字符串,所以你想要的是:
fmt.Fprintf(c.ResponseWriter, "%s", json_msg)
直接回答你的问题,但让我们更进一步:是解决你正在解决的问题的正确方法吗?不,不是真的;这样做有点奇怪。
首先,因为我们知道fmt.Fprintf
接受io.Writer
,所以我们正在讨论使用Write([]byte) (int, error)
形式的方法。您可以直接在[]byte
上调用ResponseWriter
方法,将Write()
数据写入ResponseWriter
:
_, err := c.ResponseWriter.Write(json_msg)
那个略微不那么尴尬。事实证明,有一种甚至更好的方法:使用json.Encoder
。 json.Encoder
是嵌入 io.Writer
的结构,有效地向任何io.Writer
结构添加Encode
方法,该方法将结构编码为json和把它们写给作家。不同之处在于,您所做的是将数据编码到内存中的字节切片,然后将其复制到io.Writer
,直到您可以直接写入,如下所示:
err := json.NewEncoder(c.ResponseWriter).Encode(m)
现在你甚至没有那种中间[]byte
格式。
答案 1 :(得分:2)
您使用json_msg
作为Printf
类型函数中的格式字符串,其格式字符串string
和[]byte
除外string
除外不同的类型。虽然你可以把它们互相投射)。编写字节片的正确方法是指定格式字符串:
fmt.Fprintf(WRITER_OBJ, "%s", json_msg)
这将打印[]byte
作为其Unicode内容。你不应该使用varibles作为Fprintf / Printf中的格式字符串。我不认为它会像在C中那样成问题。但如果一个"%"它可能会导致问题。加入你的JSON。
答案 2 :(得分:1)
fmt.Fprintf(c.ResponseWriter, string(json_msg))
将[]byte
投放到string