ZBLOG

可以把date和error统一成一个吗。没有date就是error

当然可以!我们可以将返回结构体简化,将数据和错误合并为一个字段。这样,如果有数据,就返回数据;如果没有数据,则返回错误。

修改后的结构体定义

我们可以将 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助手提供,问题来源于学员提问

本站部分文章来源于网络,版权归原作者所有,如有侵权请联系站长删除。
转载请注明出处:https://golang.0voice.com/?id=21222

分享:
扫描分享到社交APP
上一篇
下一篇
发表列表
游客 游客
此处应有掌声~
评论列表

还没有评论,快来说点什么吧~

联系我们

在线咨询: 点击这里给我发消息

微信号:3007537140

上班时间: 10:30-22:30

关注我们
x

注册

已经有帐号?