当然可以!我们可以将返回结构体简化,将数据和错误合并为一个字段。这样,如果有数据,就返回数据;如果没有数据,则返回错误。
修改后的结构体定义
我们可以将 UpdateResult
结构体改为仅包含一个接口类型的字段,这个字段可以是有效的数据或是错误信息。
type UpdateResult struct {
Result interface{} // 可以是更新后的数据或是错误信息
}
更新函数实现
在 UpdateSubscriptionProcedure
函数中,我们需要根据处理结果来设置这个 Result
字段:
func UpdateSubscriptionProcedure(subscriptionID string, patchJSON []byte) UpdateResult {
redisDb := db.GetRedisDb()
// 从 Redis 获取原始数据
originalJSON, err := redisDb.HGet("Subscriptions", subscriptionID).Result()
if err != nil {
log.Printf("Error getting original data from Redis: %v", err)
return UpdateResult{Result: fmt.Errorf("subscription not found")}
}
var original []byte = []byte(originalJSON)
patch, err := jsonpatch.DecodePatch(patchJSON)
if err != nil {
log.Printf("Error decoding JSON patch: %v", err)
return UpdateResult{Result: fmt.Errorf("invalid patch format")}
}
modified, err := patch.Apply(original)
if err != nil {
log.Printf("Error applying JSON patch: %v", err)
return UpdateResult{Result: fmt.Errorf("failed to apply patch")}
}
modifiedData := models.NrfSubscriptionData{}
if err := json.Unmarshal(modified, &modifiedData); err != nil {
log.Printf("Error unmarshaling modified data: %v", err)
return UpdateResult{Result: fmt.Errorf("failed to decode modified data")}
}
result := redisDb.HSet("Subscriptions", subscriptionID, modifiedData)
if result.Err() != nil {
log.Printf("Error saving updated data to Redis: %v", result.Err())
return UpdateResult{Result: fmt.Errorf("failed to save updated subscription")}
}
return UpdateResult{Result: &modifiedData} // 返回更新后的数据
}
不变的调用部分
由于你希望保持调用部分不变,只需要稍微调整一下来处理新的返回格式:
response := UpdateSubscriptionProcedure(subscriptionID, patchJSON)
// 检查返回结果是否为 error 类型,若是则直接处理错误情况
if updateErr, ok := response.Result.(error); ok && updateErr != nil {
return http_wrapper.NewResponse(http.StatusNoContent, nil, updateErr.Error())
}
// 如果 Result 是有效的数据,使用类型断言进行转换
if updatedData, ok := response.Result.(*models.NrfSubscriptionData); ok {
return http_wrapper.NewResponse(http.StatusOK, nil, updatedData)
}
// 如果未命中以上条件,可以考虑默认行为,例如:
return http_wrapper.NewResponse(http.StatusInternalServerError, nil, "unexpected error occurred")
通过这种方式,你就实现了将状态和错误合并到一个单一的字段中,同时也保证了现有的调用逻辑不会受到影响。这种设计使得函数的输出更加简洁,并且易于理解。
内容由零声教学AI助手提供,问题来源于学员提问