明白了,如果你希望修改 UpdateSubscriptionProcedure
的返回值而不更改调用部分,我们可以将该函数的返回类型从简单的响应值改为一个包含更多信息的结构体,同时保持原有调用方式不变。
修改 UpdateSubscriptionProcedure
函数
我们将定义一个新的结构体来封装返回值,然后在 UpdateSubscriptionProcedure
中使用它。这样可以保留调用方现有的逻辑。
1. 定义自定义返回类型
首先,定义一个包含更新结果和可能错误信息的结构体:
type UpdateResult struct {
Data *models.NrfSubscriptionData // 更新后的数据
Error error // 错误信息
}
2. 修改函数实现
然后,将 UpdateSubscriptionProcedure
的实现进行调整,使其返回这个新的结构体:
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{Data: nil, Error: 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{Data: nil, Error: fmt.Errorf("invalid patch format")}
}
modified, err := patch.Apply(original)
if err != nil {
log.Printf("Error applying JSON patch: %v", err)
return UpdateResult{Data: nil, Error: 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{Data: nil, Error: 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{Data: nil, Error: fmt.Errorf("failed to save updated subscription")}
}
return UpdateResult{Data: &modifiedData, Error: nil}
}
注意事项
- 错误处理:现在每个可能出错的地方都会返回一个包含错误信息的
UpdateResult
对象。 - 数据指针:注意在返回时,我将数据用指针形式 (
*models.NrfSubscriptionData
) 返回,以便避免无效引用。
不变的调用部分
保持你的调用部分不变,它依然能够正确处理响应,因为即使是 nil
值或错误也会根据相应条件得以正常处理:
response := UpdateSubscriptionProcedure(subscriptionID, patchJSON)
if response.Data != nil {
return http_wrapper.NewResponse(http.StatusOK, nil, response.Data)
} else {
return http_wrapper.NewResponse(http.StatusNoContent, nil, response.Error)
}
通过这种方式,你可以扩展函数功能,同时又不会对现有的调用逻辑产生影响。
内容由零声教学AI助手提供,问题来源于学员提问