Переглянути джерело

refactor(model): remove some indirection

For small fixed-size structures, it's better to use a slice of values, instead
of a slice of pointers to values: they're stored contiguously and thus can be
iterated on quickly by the CPU, and it does remove an indirection per object
every time the GC kicks in.
Julien Voisin 11 місяців тому
батько
коміт
8bca777a6d

+ 3 - 1
internal/model/api_key.go

@@ -8,6 +8,8 @@ import (
 )
 
 // APIKey represents an application API key.
+// We need to use a pointer for LastUsedAt,
+// as the value obtained from the database might sometimes be nil.
 type APIKey struct {
 	ID          int64      `json:"id"`
 	UserID      int64      `json:"user_id"`
@@ -18,7 +20,7 @@ type APIKey struct {
 }
 
 // APIKeys represents a collection of API Key.
-type APIKeys []*APIKey
+type APIKeys []APIKey
 
 // APIKeyCreationRequest represents the request to create a new API Key.
 type APIKeyCreationRequest struct {

+ 4 - 3
internal/model/category.go

@@ -11,8 +11,9 @@ type Category struct {
 	Title        string `json:"title"`
 	UserID       int64  `json:"user_id"`
 	HideGlobally bool   `json:"hide_globally"`
-	FeedCount    *int   `json:"feed_count,omitempty"`
-	TotalUnread  *int   `json:"total_unread,omitempty"`
+	// Pointers are needed to avoid breaking /v1/categories?counts=true
+	FeedCount   *int `json:"feed_count,omitempty"`
+	TotalUnread *int `json:"total_unread,omitempty"`
 }
 
 func (c *Category) String() string {
@@ -40,4 +41,4 @@ func (c *CategoryModificationRequest) Patch(category *Category) {
 }
 
 // Categories represents a list of categories.
-type Categories []*Category
+type Categories []Category

+ 1 - 1
internal/model/user_session.go

@@ -30,7 +30,7 @@ func (u *UserSession) UseTimezone(tz string) {
 }
 
 // UserSessions represents a list of sessions.
-type UserSessions []*UserSession
+type UserSessions []UserSession
 
 // UseTimezone converts creation date of all sessions to the given timezone.
 func (u UserSessions) UseTimezone(tz string) {

+ 1 - 1
internal/storage/api_key.go

@@ -62,7 +62,7 @@ func (s *Storage) APIKeys(userID int64) (model.APIKeys, error) {
 			return nil, fmt.Errorf(`store: unable to fetch API Key row: %v`, err)
 		}
 
-		apiKeys = append(apiKeys, &apiKey)
+		apiKeys = append(apiKeys, apiKey)
 	}
 
 	return apiKeys, nil

+ 2 - 2
internal/storage/category.go

@@ -103,7 +103,7 @@ func (s *Storage) Categories(userID int64) (model.Categories, error) {
 			return nil, fmt.Errorf(`store: unable to fetch category row: %v`, err)
 		}
 
-		categories = append(categories, &category)
+		categories = append(categories, category)
 	}
 
 	return categories, nil
@@ -158,7 +158,7 @@ func (s *Storage) CategoriesWithFeedCount(userID int64) (model.Categories, error
 			return nil, fmt.Errorf(`store: unable to fetch category row: %v`, err)
 		}
 
-		categories = append(categories, &category)
+		categories = append(categories, category)
 	}
 
 	return categories, nil

+ 1 - 1
internal/storage/user_session.go

@@ -48,7 +48,7 @@ func (s *Storage) UserSessions(userID int64) (model.UserSessions, error) {
 			return nil, fmt.Errorf(`store: unable to fetch user session row: %v`, err)
 		}
 
-		sessions = append(sessions, &session)
+		sessions = append(sessions, session)
 	}
 
 	return sessions, nil