String 如何获取结构的字符串表示形式?

String 如何获取结构的字符串表示形式?,string,struct,go,String,Struct,Go,对于我的应用程序,字符串是否为人类可读并不重要。将结构编码为字符串的一种流行方法是使用 您有某些限制,例如无法获取所有信息(例如每个字段的特定类型)、仅序列化导出的字段以及不处理递归值。但这是序列化数据的简单标准方法 工作示例: package main import ( "fmt" "encoding/json" ) type s struct { Int int String string ByteSlice []byte }

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

将结构编码为字符串的一种流行方法是使用

您有某些限制,例如无法获取所有信息(例如每个字段的特定类型)、仅序列化导出的字段以及不处理递归值。但这是序列化数据的简单标准方法

工作示例:

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="}

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

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

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

它们都记录在文档的顶部


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

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

// 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)
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!"})
}
将String()函数附加到命名结构允许我们将结构转换为字符串

fmt.Println(urls.URLS)
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!"})
}

使用
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

benchmarks tructsprintsharp
:`fmt.Sprintf(“%#v,&a)@Ask Bjørn Hansen

BenchmarkStructSprint
:`fmt.Sprintf(“%v”和&a)

BenchmarkStructSprintPlus
:`fmt.Sprintf(“%+v”和&a)


结果是,
json.Marshal
的性能更好。

您是否尝试序列化结构?您真的应该为此使用gob。感谢您的回答。我应该在我的问题中指定,我希望在程序中获取值,而不是在控制台中获取值。特别是,我希望随后将字符串转换为字节当我执行“[]字节(fmt.Printf(“%v”,var))”时,程序会抱怨“单值上下文中的多值fmt.Printf()”。我假设这是因为Printf不返回字符串值,而只将其打印到控制台。您知道解决此问题的方法吗。我通过ANisus的响应找到了解决方法,但是+1会给您一个好的答案。如果您在程序中需要它,请使用
fmt.Sprintf
而不是Printf。如果使用JSON,请注意映射值可能会丢失每次运行时不会以相同的顺序返回(尽管fmt printf也可能是这样,我还没有检查)。正是我所需要的!+1给你我注意到了第二个问题以及你的用途。JSON可能有用,但如果要使用输出字符串创建哈希来测试相等性,则不会有用。正如Ask提到的,你将遇到映射问题。这也适用于使用
fmt.Sprintf
。不知道键必须大写才能这段代码的工作副本在这里。