在Go中,如何获取结构的字符串表示?

abw*_*333 55 string struct go

对于我的应用程序,字符串是否是人类可读的并不重要.

Ask*_*sen 75

如果它是"单向"序列化(用于调试或记录或其他),那么fmt.Printf("%#v", var)非常好.(更新:将输出放入字符串而不是打印它,使用str := fmt.Sprintf("%#v", var).

如果大小很重要,你可以使用%v,但我喜欢,%#v因为它还包括字段名称和结构类型的名称.

第三种变体%+v包括字段名称,但不包括结构类型.

它们都记录在fmt文档的顶部.

如果您需要双向序列化JSON,Gob或XML是Go中最简单/内置的选项,请参阅编码包.


ANi*_*sus 72

将结构编码为字符串的一种流行方法是使用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))
}
Run Code Online (Sandbox Code Playgroud)

提供此输出:

{"Int":42,"String":"Hello World!","ByteSlice":"AAECAwQ="}
Run Code Online (Sandbox Code Playgroud)

https://play.golang.org/p/sx-xdSxAOG


小智 8

您还可以使用该结构接收器添加一个函数。

// 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)
}
Run Code Online (Sandbox Code Playgroud)

所以打印这个 struct 字段将返回一个字符串。

fmt.Println(urls.URLS)
Run Code Online (Sandbox Code Playgroud)


小智 6

将 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!"})
}
Run Code Online (Sandbox Code Playgroud)
output:
Foo Says: Hello World!
Run Code Online (Sandbox Code Playgroud)