Golang自定义YAML URL编解码问题:Unmarshal正常Marshal失效
问题原因及解决方案
你的自定义MarshalYAML无法生效的核心原因是接收者类型不匹配:
- 你定义的
MarshalYAML使用了指针接收者(*YAMLURL),但如果调用yaml.Marshal时传入的是YAMLURL的值类型,Go会优先寻找值接收者的Marshaler方法,找不到就会 fallback 到嵌入类型*url.URL的默认marshal逻辑,完全跳过你的自定义方法。 - 而
UnmarshalYAML能正常工作,是因为反序列化时你必然会传入指针(比如yaml.Unmarshal(data, &y)),刚好匹配指针接收者的方法。
两种可行的修复方案
方案1:将MarshalYAML改为值接收者
修改方法的接收者为值类型,这样无论传入值还是指针,Go都能找到对应的方法:
func (j YAMLURL) MarshalYAML() (interface{}, error) { fmt.Println("custom marshal") if j.URL == nil { return "", nil } return j.String(), nil }
方案2:marshal时传入指针类型
保持原方法的指针接收者不变,在调用yaml.Marshal时传入YAMLURL的指针:
y := YAMLURL{URL: parsedURL} data, err := yaml.Marshal(&y) // 注意这里的&符号
验证说明
修改后,自定义的MarshalYAML方法会被触发,输出URL的字符串形式,而不是默认的结构体字段展开格式。
内容的提问来源于stack exchange,提问作者Quentin
相关产品推荐
相关产品推荐

