对于我的应用程序,字符串是否可读,无关紧要。
答案 0 :(得分:67)
如果它是一种方式"序列化(用于调试或记录或其他)然后fmt.Printf("%#v", var)
非常好。 (更新:要将输出放入字符串而不是打印它,请使用str := fmt.Sprintf("%#v", var)
。
如果大小很重要,您可以使用%v
,但我喜欢%#v
,因为它还会包含字段名称和结构类型的名称。
第三个变体是%+v
,它将包括字段名称,但不包括结构类型。
它们都记录在fmt documentation的顶部。
如果您需要双向序列化JSON,Gob或XML是Go中最简单/内置的选项,请参阅encoding packages。
答案 1 :(得分:65)
将结构编码为字符串的一种流行方法是使用JSON。
您有一些限制,例如无法获取所有信息(例如每个字段的特定类型),仅序列化导出的字段,而不处理递归值。但它是一种简单的标准化数据序列化方式。
工作示例:
package main
import (
"fmt"
"encoding/json"
)
type s struct {
Int int
String string
ByteSlice []byte
}
func main() {
a := &s{42, "Hello World!", []byte{0,1,2,3,4}}
out, err := json.Marshal(a)
if err != nil {
panic (err)
}
fmt.Println(string(out))
}
提供此输出:
{"Int":42,"String":"Hello World!","ByteSlice":"AAECAwQ="}
答案 2 :(得分:3)
您还可以在该struct接收器中添加一个函数。
// URL : Sitemap Xml
type URL struct {
Loc string `xml:"loc"`
}
// URLSET : Sitemap XML
type URLSET struct {
URLS []URL `xml:"url"`
}
// converting the struct to String format.
func (u URL) String() string {
return fmt.Sprintf(u.Loc)
}
因此,打印此struct字段将返回一个字符串。
fmt.Println(urls.URLS)
答案 3 :(得分:2)
将String()函数附加到命名结构可以使我们将结构转换为字符串。
package main
import "fmt"
type foo struct {
bar string
}
func (f foo) String() string {
return fmt.Sprintf("Foo Says: %s", f.bar)
}
func main() {
fmt.Println(foo{"Hello World!"})
}
output:
Foo Says: Hello World!
答案 4 :(得分:1)
使用json
或fmt.Sprintf
进行基准测试,
BenchmarkStructJson-8 1000000 1773 ns/op
BenchmarkStructSprintSharp-8 200000 6139 ns/op
BenchmarkStructSprint-8 500000 2763 ns/op
BenchmarkStructSprintPlus-8 300000 4373 ns/op
BenchmarkStructJson
使用的是json.Marshal
@Matheus Santana
BenchmarkStructSprintSharp
:`fmt.Sprintf(“%#v”,&a)@问比约恩·汉森
BenchmarkStructSprint
:`fmt.Sprintf(“%v”,&a)
BenchmarkStructSprintPlus
:`fmt.Sprintf(“%+ v”,&a)
结果是json.Marshal
的性能更好。