Преглед изворни кода

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 пре 7 месеци
родитељ
комит
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