Go语言 戈兰亚姆勒元帅url

f1tvaqid  于 2023-03-06  发布在  Go
关注(0)|答案(1)|浏览(87)

我正在尝试使用有url字段的配置文件,我想封送和解送这种类型。文档指出我可以做一个自定义封送函数。
在这个golang游戏中,您可以看到自定义解组函数工作正常,但自定义编组函数却不行:

type YAMLURL struct {
    *url.URL
}

func (j *YAMLURL) UnmarshalYAML(unmarshal func(interface{}) error) error {
    fmt.Println("custom unmarshal function")
    var s string
    err := unmarshal(&s)
    if err != nil {
        return err
    }
    url, err := url.Parse(s)
    j.URL = url
    return err
}

func (j *YAMLURL) MarshalYAML() (interface{}, error) {
    fmt.Println("custome marshal")
    return j.String(), nil
}

https://go.dev/play/p/24JbJEhi1Q8
我不知道为什么谢谢

d8tt03nd

d8tt03nd1#

问题是您为指针接收器编写了MarshalYAML方法,因此可以在指针类型上调用此方法,同时您在Configuration结构体上将AURI属性定义为非指针(基于您粘贴的操场链接)。
因此,您必须将URI属性类型更改为*YAMLURL(而不是YAMLURL):

type A struct {
    URI *YAMLURL `yaml:"url"`
}

或者将MarshalYAML定义为非指针接收器(又称值接收器),如下所示:

func (j YAMLURL) MarshalYAML() (interface{}, error) {
    fmt.Println("custome marshal")
    return j.String(), nil
}

相关问题