Maison >développement back-end >Golang >Utiliser des pointeurs faibles dans Go
Les pointeurs faibles sont un nouvel ajout à Go (disponible dans la version 1.24) qui vous permettent de référencer des objets en mémoire sans les empêcher d'être récupérés. Cet article de blog présentera les pointeurs faibles, expliquera leur utilité et fournira un exemple concret de leur utilisation pour créer un cache économe en mémoire.
Un pointeur faible est un type particulier de référence à un objet en mémoire. Contrairement à une référence forte, un pointeur faible n’empêche pas le ramasse-miettes de récupérer l’objet référencé s’il n’existe aucune référence forte. Cela fait des pointeurs faibles un excellent outil pour les scénarios dans lesquels vous souhaitez référencer un objet mais ne voulez pas interférer avec la gestion automatique de la mémoire de Go.
Dans Go 1.24, les pointeurs faibles feront partie du nouveau package faible. Ils fonctionnent comme ceci :
Les pointeurs faibles brillent dans les cas où l'efficacité de la mémoire est cruciale. Par exemple :
Disons que vous créez un cache pour un serveur Web qui stocke les données fréquemment consultées. Vous souhaitez que le cache contienne temporairement les données, mais laissez le garbage collector nettoyer les objets qui ne sont plus utilisés ailleurs.
Voici comment procéder en utilisant des pointeurs faibles :
package main import ( "fmt" "runtime" "sync" "time" "weak" ) // Cache represents a thread-safe cache with weak pointers. type Cache[K comparable, V any] struct { mu sync.Mutex items map[K]weak.Pointer[V] // Weak pointers to cached objects } // NewCache creates a new generic Cache instance. func NewCache[K comparable, V any]() *Cache[K, V] { return &Cache[K, V]{ items: make(map[K]weak.Pointer[V]), } } // Get retrieves an item from the cache, if it's still alive. func (c *Cache[K, V]) Get(key K) (*V, bool) { c.mu.Lock() defer c.mu.Unlock() // Retrieve the weak pointer for the given key ptr, exists := c.items[key] if !exists { return nil, false } // Attempt to dereference the weak pointer val := ptr.Value() if val == nil { // Object has been reclaimed by the garbage collector delete(c.items, key) return nil, false } return val, true } // Set adds an item to the cache. func (c *Cache[K, V]) Set(key K, value V) { c.mu.Lock() defer c.mu.Unlock() // Create a weak pointer to the value c.items[key] = weak.Make(&value) } func main() { // Create a cache with string keys and string values cache := NewCache[string, string]() // Add an object to the cache data := "cached data" cache.Set("key1", data) // Retrieve it if val, ok := cache.Get("key1"); ok { fmt.Println("Cache hit:", *val) } else { fmt.Println("Cache miss") } // Simulate losing the strong reference data = "" runtime.GC() // Force garbage collection // Try to retrieve it again time.Sleep(1 * time.Second) if val, ok := cache.Get("key1"); ok { fmt.Println("Cache hit:", *val) } else { fmt.Println("Cache miss") } }
Sans pointeurs faibles, le cache contiendrait des références fortes à tous ses objets, les empêchant d'être récupérés. Cela pourrait entraîner des fuites de mémoire, en particulier sur un serveur fonctionnant depuis longtemps, où les objets mis en cache s'accumulent au fil du temps.
En utilisant des pointeurs faibles :
Sans pointeurs faibles, vous auriez besoin d'une approche plus manuelle, telle que la vérification et la suppression périodiques des objets inutilisés, ce qui ajoute de la complexité et laisse place aux bugs.
Les pointeurs faibles conviennent parfaitement aux scénarios tels que :
Cependant, évitez d'utiliser des pointeurs faibles à la place de références fortes lorsque vous avez besoin d'un accès garanti à un objet. Tenez toujours compte des exigences de mémoire et de performances de votre application.
Les pointeurs faibles sont un outil puissant pour créer des applications économes en mémoire dans Go. Cette petite fonctionnalité peut avoir un impact important dans les scénarios où une gestion efficace de la mémoire est essentielle.
Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!