这其实应该只有从PHP转Go的才会发生。
在PHP中,客户端发起HTTP请求,服务端接收请求,响应处理,到请求响应完成,结束之后,静态变量就已经销毁,但是如果在Go中也以为是这样就完全不对。
class Users {
public static $users = [];
public function GetUser($id) {
if(!isset($users[$id])) {
$users[$id] = QueryFromDb($id);
}
return $users[$id] ?? [];
}
}
var users = make([]User,0)
func GetUser(id int)(user User) {
var exists = false
for _, u := range users {
if u.Id == id {
user = u
exists = true
break
}
}
if !exists {
user = GetFromDb(id)
users = append(users,user)
}
return
}
这里很坑,users 不会销毁,一直要到 进程结束重启。
如果真的要这样用,还需要手动去清掉,导致同时读写问题。
如果用map方式更坑,会导致并发写入读取map问题。
所以用golang最好不用类似PHP那种静态变量方式节约查询。