我具有返回用户的功能。我正在为数据库ORM使用gorm:
func (dbs *DbService) GetUser(userId string) User {
var user = &User{}
dbs.db..Find(&user)
return user
}
如果我缓存结果(即用户),是否会因为我将用户放入引用类型的缓存中而导致内存分配问题,这会导致变量user超出此函数的范围吗? / p>
更新
因此,鉴于上述功能,我想使用memcache更新它以进行缓存(以下不是存储我的用户的实际代码,只是一个示例):
mc.Set(&memcache.Item{Key: "foo", Value: []byte("my value")})
这是进程外缓存。我只想知道,如果我将用户存储在此缓存中,它将不会超过我的方法调用。
答案 0 :(得分:1)
Memcache和Go变量(Go指针)彼此无关。
除非使用包unsafe
,否则您(几乎)不必担心Go变量和指针:垃圾收集器将释放无法访问的值,并且将永远不会释放可访问的值。这是一种看不见的东西,所以您不必考虑这一点。
您不能在内存缓存中存储“转到变量”。您可以将字节序列(字节数组)存储在内存缓存中,但这将与任何Go变量无关。当您将字节数组存储在内存缓存中时,字节序列将被“复制”。
如果要存储Go变量的 value ,则必须找到一种序列化值的方法,该方法可能使用JSON或gob编码,并且可以存储结果字节序列。当编码后的表单位于内存缓存中时,可以释放Go变量(如果没有对它的引用)。
当需要缓存的值时,必须从内存缓存中检索它,并对字节片进行解码(这基本上是序列化的相反过程)。