Ich habe eine Struktur, die sync.Pool
verwendet.Ist es sicher, sync.Pool Referenz als Kontextwert zu verwenden?
Ist es sicher, diese Referenz als Kontextwert zu verwenden?
type User struct {
ID string
}
var userPool = sync.Pool{
New: func() interface{} {
return &User{}
},
}
func getUser() *User {
return userPool.Get().(*User)
}
func recycleUser(user *User) {
userPool.Put(user)
}
Die Benutzerstruktur wird aus dem Pool in Middleware abgerufen.
func middleware(next http.Handler) http.Handler {
return http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
// get user from pool
user := getUser()
// user must be recycled
ctx := context.WithValue(r.Context(), "user", user)
}
}
Und in Handler recycelt.
func getUser(w http.ResponseWriter, r *http.Request) {
user := r.Context().Value("user").(*User)
// TODO: do something with user
// put user struct back into pool
recycleUser(user)
}
Edit:
Meine Frage ist, mehr darüber, wie Kontext befasst sich mit Zeiger auf mein Objekt. Macht es eine Kopie? Ist es sicher, nicht-primitive Objekte mit Kontext zu verwenden?