如何在String方法中打印原始go结构

如何在String方法中打印原始go结构,string,go,struct,types,String,Go,Struct,Types,我有一个定义如下的结构 type壁纸类型int // ... 类型信息结构{ 壁纸类型壁纸类型`json:“类型”` HelpMsg字符串`json:“帮助”` 路径字符串`json:“路径”` ImageColor.RGBA`json:“ImageColor”` } 使用 winfo:=&wallperInfo{…} log.Println(winfo) log.Printf(“%+v\n”,winfo) 给出了类似这样的东西 &{Slideshow Wallpaper是幻灯片D:\Ima

我有一个定义如下的结构

type壁纸类型int
// ...
类型信息结构{
壁纸类型壁纸类型`json:“类型”`
HelpMsg字符串`json:“帮助”`
路径字符串`json:“路径”`
ImageColor.RGBA`json:“ImageColor”`
}
使用

winfo:=&wallperInfo{…}
log.Println(winfo)
log.Printf(“%+v\n”,winfo)
给出了类似这样的东西

&{Slideshow Wallpaper是幻灯片D:\Images\Wallpapers\秋-秋-叶-模糊-特写-589840.jpg{219 77 66 167}
&{WallperType:Slideshow HelpMsg:Wallper是一个幻灯片路径:D:\Images\wallpers\秋-秋-叶-模糊-特写-589840.jpg图像颜色:{R:219 G:77 B:66 a:167}
我希望将其打印为JSON,因此我为该结构实现了
String
方法,如下所示

func(w壁纸信息)字符串()字符串{
字节,err:=json.Marshal(w)
如果错误!=零{
返回“/?”???
//这将递归调用该方法
//返回fmt.Sprintf(“%+v\n”,w)
}
返回字符串(字节)
}
如果
String()
方法中有错误

我想打印原始的
&{wallperType:Slideshow HelpMsg:wallper是一个幻灯片路径:d:\Images\wallpers\秋-秋-叶-模糊-特写-589840.jpg图像颜色:{R:219 G:77 B:66 a:167}

我尝试返回
fmt.Sprintf(“%+v\n”,w)
,但它对同一个函数进行递归调用

我可以返回原始结构格式吗?因为如果json失败,我不知道如何以不同的方式打印它。

创建一个以
wallperInfo
作为其属性的文件,并在将其传递给之前创建一个值。创建新类型将使其从所有方法中剥离,包括
String()
方法:

func (w WallpaperInfo) String() string {
    bytes, err := json.Marshal(w)
    if err != nil {
        type wi WallpaperInfo
        return fmt.Sprintf("%+v\n", wi(w))
    }
    return string(bytes)
}
虽然您的类型永远不能返回JSON封送错误,但在一般情况下,这就是您实现所需的方式

下面是一个故意导致JSON封送失败的示例,它将返回到原始的结构字符串表示形式:

type fail int

func (fail) MarshalJSON() ([]byte, error) {
    return nil, errors.New("on-purpose error")
}

type MyStruct struct {
    F fail
}

func (m MyStruct) String() string {
    bytes, err := json.Marshal(m)
    if err != nil {
        log.Printf("JSON error: %v", err)
        type ms MyStruct
        return fmt.Sprintf("%+v\n", ms(m))
    }
    return string(bytes)
}
测试它:

s := MyStruct{}

log.Println(s)
log.Printf("%+v\n", s)
哪个将输出(在上尝试):

见相关问题:

2009/11/10 23:00:00 JSON error: json: error calling MarshalJSON for type main.fail: on-purpose error
2009/11/10 23:00:00 {F:0}

2009/11/10 23:00:00 JSON error: json: error calling MarshalJSON for type main.fail: on-purpose error
2009/11/10 23:00:00 {F:0}