关于 GO 函数值传递的问题

2022-02-10 11:38:34 +08:00
 johnlin

问题描述:
调用 OnceDo 方法,传入一个 userModel 的结构体地址,然后在 OnceDo 中通过 interface 类型的参数接收并且通过匿名方法获得 user 信息的值,我想在 HandleUserInfo 方法中拿到 user 信息,这个怎么处理
方案:
目前想到的也就是通过反射一个个遍历改变 userModel 的每个值,为了简便直接用了 json.Unmarshal 方法
需要解决的问题:
各位大佬还有没有其它方案或者比 json.Unmarshal 更效率的方法?

//处理用户信息
func HandleUserInfo(userId int) (bool,*model.User) {
	cacheKey := fmt.Sprintf(util.BackendCacheKeyList[0]+"%d",userId)
	userModel := &model.User{}
	fetchDataFromDb := func() (interface{}, error) {
		err,userEntity := service.ServiceGroupApp.SystemServiceGroup.GetUserInfo(userId)
		return	userEntity,err
	}//该匿名函数返回 mysql user 表的数据值
	if err := redisClient.OnceDo(global.GVA_REDIS,cacheKey, userModel, util.CacheTimeList[0], fetchDataFromDb);err == nil {
		return true, userModel
	}
	return false, userModel
}
//调用函数--查询缓存,存在返回缓存数据,不存在查询数据库
func OnceDo(client *redis.Client, key string, obj interface{}, expiration time.Duration, do func() (data interface{}, err error)) (err error) {
	//第二次调用可以直接忽略
    if RExists(client, key) == true {
		value, err := client.Get(context.Background(), key).Bytes()
		if err == nil {
			return json.Unmarshal(value, obj)
		}
	}
    //第一次调用
	obj, err = do()
	if err == nil {
		p, mErr := json.Marshal(obj)
		if mErr == nil {
			//主要问题就是这个 obj 参数,我想在 HandleUserInfo 拿到这个 obj 的值,目前我想到的最简单的就是通过 json.Unmarshal 方法解决
			json.Unmarshal(p, obj)
			//
			return client.Set(context.Background(), key, p, expiration).Err()
		}
		return mErr
	}
	return err
}
798 次点击
所在节点    问与答
1 条回复
johnlin
2022-02-10 13:48:13 +08:00
OnceDo 方法写错了<br />
func OnceDo(client *redis.Client, key string, obj interface{}, expiration time.Duration, do func() (data interface{}, err error)) (err error) {
if RExists(client, key) == true {
value, err := client.Get(context.Background(), key).Bytes()
if err == nil {
return json.Unmarshal(value, obj)
}
}

newData, oErr := do()
if oErr == nil {
p, mErr := json.Marshal(newData)
if mErr == nil {
json.Unmarshal(p, obj)
return client.Set(context.Background(), key, p, expiration).Err()
}
return mErr
}
return err
}

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/832892

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX