是的,你可以将 UpdateResult
直接定义为 *models.NrfSubscriptionData
,这会使得返回值更加简洁。这样的话,如果更新成功,你就能直接返回指向 NrfSubscriptionData
的指针;如果出现错误,则返回 nil
。以下是调整后的实现方式。
修改后的结构体定义
不需要单独定义一个结构体,只需将返回类型设置为 *models.NrfSubscriptionData
:
func UpdateSubscriptionProcedure(subscriptionID string, patchJSON []byte) *models.NrfSubscriptionData {
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 nil // 返回空指针
}
var original []byte = []byte(originalJSON)
patch, err := jsonpatch.DecodePatch(patchJSON)
if err != nil {
log.Printf("Error decoding JSON patch: %v", err)
return nil // 返回空指针
}
modified, err := patch.Apply(original)
if err != nil {
log.Printf("Error applying JSON patch: %v", err)
return nil // 返回空指针
}
modifiedData := models.NrfSubscriptionData{}
if err := json.Unmarshal(modified, &modifiedData); err != nil {
log.Printf("Error unmarshaling modified data: %v", err)
return nil // 返回空指针
}
result := redisDb.HSet("Subscriptions", subscriptionID, modifiedData)
if result.Err() != nil {
log.Printf("Error saving updated data to Redis: %v", result.Err())
return nil // 返回空指针
}
return &modifiedData // 返回更新后的数据的指针
}
调用部分
在调用该函数时,你依然可以通过检查返回值来判断是否发生了错误:
response := UpdateSubscriptionProcedure(subscriptionID, patchJSON)
// 检查返回的 Result 是否为 nil,若是则表示发生了错误
if response == nil {
return http_wrapper.NewResponse(http.StatusNoContent, nil, "update failed") // 或根据需要自定义消息
}
// 如果 response 非空,使用其内容进行后续处理
return http_wrapper.NewResponse(http.StatusOK, nil, response)
总结
这种方式更加简单明了,直接使用指针类型作为返回值,可以清晰地反映出操作是否成功。在遇到错误时,函数返回 nil
来表明没有有效结果。这样在处理响应时也变得更直观。
内容由零声教学AI助手提供,问题来源于学员提问