我正在try 使用具有url字段的配置文件,并且我想要封送和反封送此类型. 文档指出,我可以定制marshal function.

在这个Golangplayground 中,您可以看到定制的解组函数运行良好,但定制的编组函数无法正常工作:

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

我也不知道原因 谢谢

推荐答案

问题是,您为指针接收器编写了MarshalYAML方法,因此您可以在指针类型上调用此方法,同时将Configuration struct 上AURI属性定义为非指针(基于粘贴的操场链接).

因此,您必须将URI属性类型更改为*YAMLURL(而不是YAMLURL):

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

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

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

Go相关问答推荐

无法找到与golang、nginx和postquist进行的docker-compose./主要

从Kafka到Clickhouse的实时消费数据

Term~T中的类型不能是类型参数,但可以是引用类型参数的切片

验证访问令牌(密钥罩)

如何在Golang中获取mp3文件的持续时间?

Docker Compose Health Check未退出,错误为无法启动

Caddy服务器try 打开端口80而不是8090.

Kubo,来自 IpfsNode.Bootstrap 的无效内存地址或零指针取消引用

如何以干净的方式在中间件中注入 repo 或服务?

如何在 `hashicorp / terraform-exec` 中将 `ApplyConfig` 传递给 `tf.Apply()`?

缺少签名帮助文档

assert: mock: I don't know what to return because the method call was unexpected 在 Go 中编写单元测试时出错

在恒等函数中将类型 T 转换为类型 U

GqlGen - 在字段解析器中访问查询输入参数

如何使用 math/big 对 bigInt 进行取模?

使用 Golang SQL 驱动程序连接到snowflake

显示作为服务帐户身份验证的谷歌日历事件 - Golang App

Golang 'defer' 导致发送(接收)API 响应延迟

为什么 template.ParseFiles() 没有检测到这个错误?

在 Go 泛型中,如何对联合约束中的类型使用通用方法?