Proto3不像 那样严格Proto2,并且没有requiredoroptional字段,没有自定义default值。
鉴于以下定义...
message Order {
enum Side {
BID = 0;
ASK = 1;
}
int64 time = 1;
double price = 2;
double volume = 3;
Side side = 4;
}
Run Code Online (Sandbox Code Playgroud)
这些字段中的任何一个都有默认值,毕竟现在没有规则规定您在.build()对象之前必须或不可以提供什么。
time因此is 0、priceis0.0和sideis的默认值BID,如果您打印一个没有提供其中一个字段或提供默认值的实例,那么运行时会将其视为在这两种情况下从未提供过,因此无法确定是否该值是手动设置的BID或被视为默认值。
例如,如果我们执行以下代码(其 kotlin)
Order.newBuilder()
.setPrice(1.0)
.setVolume(2.0)
.setSide(Order.Side.BID)
.build()
.apply { println(this) }
Run Code Online (Sandbox Code Playgroud)
我们将得到这个输出
price: 1.0
volume: 2.0
Run Code Online (Sandbox Code Playgroud)
至少这很烦人,因为当您使用标准.toString()或 …