我有自己写的Marshall和Unmarshaller的自定义类型
问题是我想使用protobuf做同样的事情

我只想使用protobuf来实现相同的功能,以便可以实现自己的Marshall和Unmarshaller

syntax="proto3";

package main;

message NullInt64{
    bool Valid = 1;
    int64 Int64 = 2;
}

以这种方式,如果有效值为false,则返回null字符串
type NullInt64 struct {
    Int64 int64
    Valid bool
}

// MarshalJSON try to marshaling to json
func (nt NullInt64) MarshalJSON() ([]byte, error) {
    if nt.Valid {
        return []byte(fmt.Sprintf(`%d`, nt.Int64)), nil
    }

    return []byte("null"), nil
}

// UnmarshalJSON try to unmarshal dae from input
func (nt *NullInt64) UnmarshalJSON(b []byte) error {
    text := strings.ToLower(string(b))
    if text == "null" {
        nt.Valid = false

        return nil
    }

    err := json.Unmarshal(b, &nt.Int64)
    if err != nil {
        return err
    }

    nt.Valid = true
    return nil
}

最佳答案

Protoc将不会生成MarshalJSONUnmarshalJSON函数。
你可以:

  • 使用其他protobuf生成器(请参阅gogo/protobuf,有很多extensions或fork golang/protobuf来更改其generator)
  • 通过向该文件夹添加文件,将自己的函数插入proto包。您可以手写或通过代码生成这些功能。
  • 关于go - 在golang中为proto buf类型编写自定义的Marshall和Unmarshaller,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/56414869/

    10-12 05:13