对于我的应用程序,字符串是否可读并不重要。
将结构编码为字符串的一种流行方法是使用 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="}
将
String()
函数附加到命名结构允许我们将结构转换为字符串。
package main
import "fmt"
type Foo struct {
Bar string
}
func (f Foo) String() string {
return fmt.Sprintf("Foo says: %q", f.Bar)
}
func main() {
fmt.Println(Foo{Bar: "Hello World!"})
}
输出:
Foo says: "Hello World!"
您还可以使用该结构接收器添加一个函数。
// 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)
}
因此打印这个结构体字段将返回一个字符串。
fmt.Println(urls.URLS)
使用
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)
@问Bjørn Hansen
BenchmarkStructSprint
:fmt.Sprintf("%v", &a)
BenchmarkStructSprintPlus
:fmt.Sprintf("%+v", &a)
结果是,
json.Marshal
表现更好。