go - 如何在 Proto3 中为 HTTP 响应创建可空字段?
问题描述
我想将一个对象作为 HTTP 响应返回,其中一个字段可以为空。问题是 proto3 不会让我轻易做到。发生这种情况是因为我将字符串指针解析为字符串,因此当指针指向 null 时会产生此错误
runtime error: invalid memory address or nil pointer dereference
我试图通过至少从互联网上学到的这两种变通方法来解决这个问题。
1.使用一个
exercise.proto(消息定义)
message ExercisesData {
string Serial = 1 [json_name="serial"];
string Title = 2 [json_name="title"];
oneof OptionalSubmissionSerial {
string SubmissionSerial = 3 [json_name="submission_serial"];
}
mapper.go(解析 Go 结构以适应原始消息)
exercise := &Exercise.ExercisesData {
Serial: e.Serial,
Title: e.Title,
OptionalSubmissionSerial: &Exercise.ExercisesData_SubmissionSerial{
SubmissionSerial: *e.SubmissionInfo.LatestSubmissionSerial,
},
}
2.使用google/protobuf/wrappers.proto
exercise.proto(消息定义)
import "google/protobuf/wrappers.proto";
message ExercisesData {
string Serial = 1 [json_name="serial"];
string Title = 2 [json_name="title"];
google.protobuf.StringValue SubmissionSerial = 3 [json_name="submission_serial"];
}
mapper.go(解析 Go 结构以适应原始消息)
exercise := &Exercise.ExercisesData {
Serial: e.Serial,
Title: e.Title,
SubmissionSerial: &wrappers.StringValue{
Value: *e.SubmissionInfo.LatestSubmissionSerial,
},
}
预期结果
两种方式仍然产生相同的错误消息,唯一的区别是它引用的代码行。这就是为什么我如此无助。预期的 HTTP 响应如下所示
{
"status": "success",
"data": [
{
"serial": "EXC-NT2OBHQT",
"title": "Title of Topic Exercise",
"submission_serial": null
}
]
}
我真的希望任何人都可以帮助我找到一种方法来在 proto3 中为 Http 响应定义一个可为空的字段,以及如何从 struct 中解析它。谢谢!
解决方案
事实证明,我找到了另一种真正有效的解决方法!它正在使用 google/protobuf/wrappers.proto 但我必须在映射器中稍微调整一下。事情是这样的:
exercise.proto(消息定义)
import "google/protobuf/wrappers.proto";
message ExercisesData {
string Serial = 1 [json_name="serial"];
string Title = 2 [json_name="title"];
google.protobuf.StringValue SubmissionSerial = 3 [json_name="submission_serial"];
}
mapper.go(解析 Go 结构以适应原始消息)
import "github.com/golang/protobuf/ptypes/wrappers"
exercise := &pbExercise.GetExercisesData{
Serial: e.Serial,
Title: e.Title,
}
if e.SubmissionInfo.LatestSubmissionSerial != nil {
exercise.SubmissionSerial = &wrappers.StringValue{
Value: *e.LatestSubmissionSerial,
}
}
推荐阅读
- python-3.x - 使用加入与否?XML Python API
- python - 定位一个只有 'd' 属性和 selenium 的路径元素
- r - 如何将股票代码读入函数?
- c++ - C++ - 将二维数组传递给函数
- python - 使用json标签水平翻转数据集中图像的简单方法?
- php - 使用数据表时,具有一列复选框的表格显示被隐藏
- amazon-ecs - 如何从 Docker 实例内部将多个日志流式传输到 AWS CloudWatch?
- python - 根据 'key=value' 项将 pandas 列拆分为多个列
- jetbrains-ide - 如何在 JetBrains Marketplace 准入期间配置插件验证程序?
- python - 尽管安装了两个模型,但没有名为“pandas”、“mysql”的模块