Skip to content

Commit 0a3e6c7

Browse files
committed
all: reduce heap allocations
Most parsers were returning a pointer to a struct type. This makes an unnecessary heap allocation. This commit changes all parsers to return the struct they build itself, instead of a pointer to them.
1 parent f42e70f commit 0a3e6c7

22 files changed

+98
-100
lines changed

src/TibiaBoostableBossesOverview.go

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -34,21 +34,21 @@ var (
3434
BoostableBossInformationRegex = regexp.MustCompile(`<img src="(.*)" border.*div>(.*)<\/div>`)
3535
)
3636

37-
func TibiaBoostableBossesOverviewImpl(BoxContentHTML string) (*BoostableBossesOverviewResponse, error) {
37+
func TibiaBoostableBossesOverviewImpl(BoxContentHTML string) (BoostableBossesOverviewResponse, error) {
3838
// Creating empty vars
3939
var (
4040
BoostedBossName, BoostedBossImage string
4141
)
4242
// Loading HTML data into ReaderHTML for goquery with NewReader
4343
ReaderHTML, err := goquery.NewDocumentFromReader(strings.NewReader(BoxContentHTML))
4444
if err != nil {
45-
return nil, fmt.Errorf("[error] TibiaBoostableBossesOverviewImpl failed at goquery.NewDocumentFromReader, err: %s", err)
45+
return BoostableBossesOverviewResponse{}, fmt.Errorf("[error] TibiaBoostableBossesOverviewImpl failed at goquery.NewDocumentFromReader, err: %s", err)
4646
}
4747

4848
// Getting data from div.InnerTableContainer and then first p
4949
InnerTableContainerTMPB, err := ReaderHTML.Find(".InnerTableContainer p").First().Html()
5050
if err != nil {
51-
return nil, fmt.Errorf("[error] TibiaBoostableBossesOverviewImpl failed at ReaderHTML.Find, error: %s", err)
51+
return BoostableBossesOverviewResponse{}, fmt.Errorf("[error] TibiaBoostableBossesOverviewImpl failed at ReaderHTML.Find, error: %s", err)
5252
}
5353

5454
// Regex to get data for name for boosted boss
@@ -105,11 +105,11 @@ func TibiaBoostableBossesOverviewImpl(BoxContentHTML string) (*BoostableBossesOv
105105
})
106106

107107
if insideError != nil {
108-
return nil, insideError
108+
return BoostableBossesOverviewResponse{}, insideError
109109
}
110110

111111
// Build the data-blob
112-
return &BoostableBossesOverviewResponse{
112+
return BoostableBossesOverviewResponse{
113113
BoostableBossesContainer{
114114
Boosted: OverviewBoostableBoss{
115115
Name: TibiaDataSanitizeEscapedString(BoostedBossName),

src/TibiaCharactersCharacter.go

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -132,7 +132,7 @@ var (
132132
)
133133

134134
// TibiaCharactersCharacter func
135-
func TibiaCharactersCharacterImpl(BoxContentHTML string) (*CharacterResponse, error) {
135+
func TibiaCharactersCharacterImpl(BoxContentHTML string) (CharacterResponse, error) {
136136
var (
137137
// local strings used in this function
138138
localDivQueryString = ".TableContentContainer tr"
@@ -154,7 +154,7 @@ func TibiaCharactersCharacterImpl(BoxContentHTML string) (*CharacterResponse, er
154154
// Loading HTML data into ReaderHTML for goquery with NewReader
155155
ReaderHTML, err := goquery.NewDocumentFromReader(strings.NewReader(BoxContentHTML))
156156
if err != nil {
157-
return nil, fmt.Errorf("TibiaCharactersCharacterImpl failed at goquery.NewDocumentFromReader, err: %s", err)
157+
return CharacterResponse{}, fmt.Errorf("TibiaCharactersCharacterImpl failed at goquery.NewDocumentFromReader, err: %s", err)
158158
}
159159

160160
// Running query on every .TableContainer
@@ -507,9 +507,9 @@ func TibiaCharactersCharacterImpl(BoxContentHTML string) (*CharacterResponse, er
507507
// Search for errors
508508
switch {
509509
case characterNotFound:
510-
return nil, validation.ErrorCharacterNotFound
510+
return CharacterResponse{}, validation.ErrorCharacterNotFound
511511
case insideError != nil:
512-
return nil, insideError
512+
return CharacterResponse{}, insideError
513513
case reflect.DeepEqual(charData, Character{}):
514514
// There are some rare cases where a character name would
515515
// bug out tibia.com (tíbia, for example) and then we would't
@@ -519,12 +519,12 @@ func TibiaCharactersCharacterImpl(BoxContentHTML string) (*CharacterResponse, er
519519
//
520520
// Validating those names would also be a pain because of old
521521
// tibian names such as Kolskägg, which for whatever reason is valid
522-
return nil, validation.ErrorCharacterNotFound
522+
return CharacterResponse{}, validation.ErrorCharacterNotFound
523523
}
524524

525525
//
526526
// Build the data-blob
527-
return &CharacterResponse{
527+
return CharacterResponse{
528528
charData,
529529
Information{
530530
APIDetails: TibiaDataAPIDetails,

src/TibiaCreaturesCreature.go

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -52,20 +52,20 @@ var (
5252
CreatureLootRegex = regexp.MustCompile(`.*yield (.*) experience.*carry (.*)with them.`)
5353
)
5454

55-
func TibiaCreaturesCreatureImpl(race string, BoxContentHTML string) (*CreatureResponse, error) {
55+
func TibiaCreaturesCreatureImpl(race string, BoxContentHTML string) (CreatureResponse, error) {
5656
// local strings used in this function
5757
var localDamageString = " damage"
5858

5959
// Loading HTML data into ReaderHTML for goquery with NewReader
6060
ReaderHTML, err := goquery.NewDocumentFromReader(strings.NewReader(BoxContentHTML))
6161
if err != nil {
62-
return nil, fmt.Errorf("[error] TibiaCreaturesCreatureImp failed at goquery.NewDocumentFromReader, error: %s", err)
62+
return CreatureResponse{}, fmt.Errorf("[error] TibiaCreaturesCreatureImp failed at goquery.NewDocumentFromReader, error: %s", err)
6363
}
6464

6565
// Getting data
6666
InnerTableContainerTMP1, err := ReaderHTML.Find(".BoxContent div").First().NextAll().Html()
6767
if err != nil {
68-
return nil, fmt.Errorf("[error] TibiaCreaturesCreatureImp failed at ReaderHTML.Find, error: %s", err)
68+
return CreatureResponse{}, fmt.Errorf("[error] TibiaCreaturesCreatureImp failed at ReaderHTML.Find, error: %s", err)
6969
}
7070

7171
// Regex to get data
@@ -162,11 +162,11 @@ func TibiaCreaturesCreatureImpl(race string, BoxContentHTML string) (*CreatureRe
162162
}
163163
} else {
164164
log.Printf("[warning] TibiaCreaturesCreatureImpl called on invalid creature")
165-
return nil, validation.ErrorCreatureNotFound
165+
return CreatureResponse{}, validation.ErrorCreatureNotFound
166166
}
167167

168168
// Build the data-blob
169-
return &CreatureResponse{
169+
return CreatureResponse{
170170
Creature{
171171
Name: CreatureName,
172172
Race: race,

src/TibiaCreaturesOverview.go

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -35,21 +35,21 @@ var (
3535
CreatureInformationRegex = regexp.MustCompile(`.*race=(.*)"><img src="(.*)" border.*div>(.*)<\/div>`)
3636
)
3737

38-
func TibiaCreaturesOverviewImpl(BoxContentHTML string) (*CreaturesOverviewResponse, error) {
38+
func TibiaCreaturesOverviewImpl(BoxContentHTML string) (CreaturesOverviewResponse, error) {
3939
var (
4040
BoostedCreatureName, BoostedCreatureRace, BoostedCreatureImage string
4141
)
4242

4343
// Loading HTML data into ReaderHTML for goquery with NewReader
4444
ReaderHTML, err := goquery.NewDocumentFromReader(strings.NewReader(BoxContentHTML))
4545
if err != nil {
46-
return nil, fmt.Errorf("[error] TibiaCreaturesOverviewImpl failed at goquery.NewDocumentFromReader, err: %s", err)
46+
return CreaturesOverviewResponse{}, fmt.Errorf("[error] TibiaCreaturesOverviewImpl failed at goquery.NewDocumentFromReader, err: %s", err)
4747
}
4848

4949
// Getting data from div.InnerTableContainer and then first p
5050
InnerTableContainerTMPB, err := ReaderHTML.Find(".InnerTableContainer p").First().Html()
5151
if err != nil {
52-
return nil, fmt.Errorf("[error] TibiaCreaturesOverviewImpl failed at ReaderHTML.Find, err: %s", err)
52+
return CreaturesOverviewResponse{}, fmt.Errorf("[error] TibiaCreaturesOverviewImpl failed at ReaderHTML.Find, err: %s", err)
5353
}
5454

5555
// Regex to get data for name and race param for boosted creature
@@ -110,11 +110,11 @@ func TibiaCreaturesOverviewImpl(BoxContentHTML string) (*CreaturesOverviewRespon
110110
})
111111

112112
if insideError != nil {
113-
return nil, insideError
113+
return CreaturesOverviewResponse{}, insideError
114114
}
115115

116116
// Build the data-blob
117-
return &CreaturesOverviewResponse{
117+
return CreaturesOverviewResponse{
118118
CreaturesContainer{
119119
Boosted: OverviewCreature{
120120
Name: TibiaDataSanitizeEscapedString(BoostedCreatureName),

src/TibiaFansites.go

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -61,11 +61,11 @@ var (
6161
FansiteAnchorRegex = regexp.MustCompile(`.*src="(.*)" alt=".*`)
6262
)
6363

64-
func TibiaFansitesImpl(BoxContentHTML string) (*FansitesResponse, error) {
64+
func TibiaFansitesImpl(BoxContentHTML string) (FansitesResponse, error) {
6565
// Loading HTML data into ReaderHTML for goquery with NewReader
6666
ReaderHTML, err := goquery.NewDocumentFromReader(strings.NewReader(BoxContentHTML))
6767
if err != nil {
68-
return nil, fmt.Errorf("[error] TibiaFansitesImpl failed at goquery.NewDocumentFromReader, err: %s", err)
68+
return FansitesResponse{}, fmt.Errorf("[error] TibiaFansitesImpl failed at goquery.NewDocumentFromReader, err: %s", err)
6969
}
7070

7171
// Creating empty PromotedFansitesData and SupportedFansitesData var
@@ -77,7 +77,7 @@ func TibiaFansitesImpl(BoxContentHTML string) (*FansitesResponse, error) {
7777
for _, FansiteType := range FansiteTypes {
7878
fansites, err := makeFansiteRequest(FansiteType, ReaderHTML)
7979
if err != nil {
80-
return nil, fmt.Errorf("[error] TibiaFansitesImpl failed at makeFansiteRequest, type: %s, err: %s", FansiteType, err)
80+
return FansitesResponse{}, fmt.Errorf("[error] TibiaFansitesImpl failed at makeFansiteRequest, type: %s, err: %s", FansiteType, err)
8181
}
8282

8383
switch FansiteType {
@@ -89,7 +89,7 @@ func TibiaFansitesImpl(BoxContentHTML string) (*FansitesResponse, error) {
8989
}
9090

9191
// Build the data-blob
92-
return &FansitesResponse{
92+
return FansitesResponse{
9393
Fansites{
9494
PromotedFansites: PromotedFansitesData,
9595
SupportedFansites: SupportedFansitesData,

src/TibiaGuildsGuild.go

Lines changed: 8 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -78,7 +78,7 @@ var (
7878
GuildMemberInvitesInformationRegex = regexp.MustCompile(`<td><a.*">(.*)<\/a><\/td><td>(.*)<\/td>`)
7979
)
8080

81-
func TibiaGuildsGuildImpl(guild string, BoxContentHTML string) (*GuildResponse, error) {
81+
func TibiaGuildsGuildImpl(guild string, BoxContentHTML string) (GuildResponse, error) {
8282
// Creating empty vars
8383
var (
8484
MembersData []GuildMember
@@ -92,22 +92,22 @@ func TibiaGuildsGuildImpl(guild string, BoxContentHTML string) (*GuildResponse,
9292
// Loading HTML data into ReaderHTML for goquery with NewReader
9393
ReaderHTML, err := goquery.NewDocumentFromReader(strings.NewReader(BoxContentHTML))
9494
if err != nil {
95-
return nil, fmt.Errorf("[error] TibiaGuildsGuildImpl failed at goquery.NewDocumentFromReader, err: %s", err)
95+
return GuildResponse{}, fmt.Errorf("[error] TibiaGuildsGuildImpl failed at goquery.NewDocumentFromReader, err: %s", err)
9696
}
9797

9898
guildName, err := ReaderHTML.Find("h1").First().Html()
9999
if err != nil {
100-
return nil, fmt.Errorf("[error] TibiaGuildsGuildImpl failed at ReaderHTML.Find, err: %s", err)
100+
return GuildResponse{}, fmt.Errorf("[error] TibiaGuildsGuildImpl failed at ReaderHTML.Find, err: %s", err)
101101
}
102102

103103
if guildName == "" {
104-
return nil, validation.ErrorGuildNotFound
104+
return GuildResponse{}, validation.ErrorGuildNotFound
105105
}
106106

107107
// Getting data from div.InnerTableContainer and then first p
108108
InnerTableContainerTMPA, err := ReaderHTML.Find(".BoxContent table").Html()
109109
if err != nil {
110-
return nil, fmt.Errorf("[error] TibiaGuildsGuildImpl failed at InnerTableContainerTMPA ReaderHTML.Find, err: %s", err)
110+
return GuildResponse{}, fmt.Errorf("[error] TibiaGuildsGuildImpl failed at InnerTableContainerTMPA ReaderHTML.Find, err: %s", err)
111111
}
112112

113113
subma1b := GuildLogoRegex.FindAllStringSubmatch(InnerTableContainerTMPA, -1)
@@ -119,7 +119,7 @@ func TibiaGuildsGuildImpl(guild string, BoxContentHTML string) (*GuildResponse,
119119
// Getting data from div.InnerTableContainer and then first p
120120
InnerTableContainerTMPB, err := ReaderHTML.Find("#GuildInformationContainer").Html()
121121
if err != nil {
122-
return nil, fmt.Errorf("[error] TibiaGuildsGuildImpl failed at InnerTableContainerTMPB ReaderHTML.Find, err: %s", err)
122+
return GuildResponse{}, fmt.Errorf("[error] TibiaGuildsGuildImpl failed at InnerTableContainerTMPB ReaderHTML.Find, err: %s", err)
123123
}
124124

125125
for _, line := range strings.Split(strings.TrimSuffix(InnerTableContainerTMPB, "\n"), "\n") {
@@ -253,12 +253,12 @@ func TibiaGuildsGuildImpl(guild string, BoxContentHTML string) (*GuildResponse,
253253
})
254254

255255
if insideError != nil {
256-
return nil, insideError
256+
return GuildResponse{}, insideError
257257
}
258258

259259
//
260260
// Build the data-blob
261-
return &GuildResponse{
261+
return GuildResponse{
262262
Guild{
263263
Name: guildName,
264264
World: GuildWorld,

src/TibiaGuildsOverview.go

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -28,7 +28,7 @@ type GuildsOverviewResponse struct {
2828
Information Information `json:"information"`
2929
}
3030

31-
func TibiaGuildsOverviewImpl(world string, BoxContentHTML string) (*GuildsOverviewResponse, error) {
31+
func TibiaGuildsOverviewImpl(world string, BoxContentHTML string) (GuildsOverviewResponse, error) {
3232
// Creating empty vars
3333
var (
3434
ActiveGuilds, FormationGuilds []OverviewGuild
@@ -38,7 +38,7 @@ func TibiaGuildsOverviewImpl(world string, BoxContentHTML string) (*GuildsOvervi
3838
// Loading HTML data into ReaderHTML for goquery with NewReader
3939
ReaderHTML, err := goquery.NewDocumentFromReader(strings.NewReader(BoxContentHTML))
4040
if err != nil {
41-
return nil, fmt.Errorf("[error] TibiaGuildsOverviewImpl failed at goquery.NewDocumentFromReader, err: %s", err)
41+
return GuildsOverviewResponse{}, fmt.Errorf("[error] TibiaGuildsOverviewImpl failed at goquery.NewDocumentFromReader, err: %s", err)
4242
}
4343

4444
// Running query over each div
@@ -87,7 +87,7 @@ func TibiaGuildsOverviewImpl(world string, BoxContentHTML string) (*GuildsOvervi
8787

8888
//
8989
// Build the data-blob
90-
return &GuildsOverviewResponse{
90+
return GuildsOverviewResponse{
9191
OverviewGuilds{
9292
World: world,
9393
Active: ActiveGuilds,

src/TibiaHighscores.go

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -53,11 +53,11 @@ var (
5353
SixColumnRegex = regexp.MustCompile(`<td>(.*)<\/td><td.*">(.*)<\/a><\/td><td.*">(.*)<\/td><td>(.*)<\/td><td.*>(.*)<\/td><td.*>(.*)<\/td>`)
5454
)
5555

56-
func TibiaHighscoresImpl(world string, category validation.HighscoreCategory, vocationName string, currentPage int, BoxContentHTML string) (*HighscoresResponse, error) {
56+
func TibiaHighscoresImpl(world string, category validation.HighscoreCategory, vocationName string, currentPage int, BoxContentHTML string) (HighscoresResponse, error) {
5757
// Loading HTML data into ReaderHTML for goquery with NewReader
5858
ReaderHTML, err := goquery.NewDocumentFromReader(strings.NewReader(BoxContentHTML))
5959
if err != nil {
60-
return nil, fmt.Errorf("[error] TibiaHighscoresImpl failed at goquery.NewDocumentFromReader, err: %s", err)
60+
return HighscoresResponse{}, fmt.Errorf("[error] TibiaHighscoresImpl failed at goquery.NewDocumentFromReader, err: %s", err)
6161
}
6262

6363
// Creating empty HighscoreData var
@@ -81,7 +81,7 @@ func TibiaHighscoresImpl(world string, category validation.HighscoreCategory, vo
8181
}
8282

8383
if currentPage > HighscoreTotalPages {
84-
return nil, validation.ErrorHighscorePageTooBig
84+
return HighscoresResponse{}, validation.ErrorHighscorePageTooBig
8585
}
8686

8787
var insideError error
@@ -156,12 +156,12 @@ func TibiaHighscoresImpl(world string, category validation.HighscoreCategory, vo
156156
categoryString, _ := category.String()
157157

158158
if insideError != nil {
159-
return nil, insideError
159+
return HighscoresResponse{}, insideError
160160
}
161161

162162
//
163163
// Build the data-blob
164-
return &HighscoresResponse{
164+
return HighscoresResponse{
165165
Highscores{
166166
World: cases.Title(language.English).String(world),
167167
Category: categoryString,

src/TibiaHousesOverview.go

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -49,7 +49,7 @@ var (
4949
)
5050

5151
// TibiaHousesOverview func
52-
func TibiaHousesOverviewImpl(c *gin.Context, world string, town string, htmlDataCollector func(TibiaDataRequestStruct) (string, error)) (*HousesOverviewResponse, error) {
52+
func TibiaHousesOverviewImpl(c *gin.Context, world string, town string, htmlDataCollector func(TibiaDataRequestStruct) (string, error)) (HousesOverviewResponse, error) {
5353
var (
5454
// Creating empty vars
5555
HouseData, GuildhallData []HousesHouse
@@ -62,7 +62,7 @@ func TibiaHousesOverviewImpl(c *gin.Context, world string, town string, htmlData
6262
for _, HouseType := range HouseTypes {
6363
houses, err := makeHouseRequest(HouseType, world, town, htmlDataCollector)
6464
if err != nil {
65-
return nil, fmt.Errorf("[error] TibiaHousesOverviewImpl failed at makeHouseRequest, type: %s, err: %s", HouseType, err)
65+
return HousesOverviewResponse{}, fmt.Errorf("[error] TibiaHousesOverviewImpl failed at makeHouseRequest, type: %s, err: %s", HouseType, err)
6666
}
6767

6868
switch HouseType {
@@ -74,7 +74,7 @@ func TibiaHousesOverviewImpl(c *gin.Context, world string, town string, htmlData
7474
}
7575

7676
// Build the data-blob
77-
return &HousesOverviewResponse{
77+
return HousesOverviewResponse{
7878
HousesHouses{
7979
World: world,
8080
Town: town,

src/TibiaKillstatistics.go

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -38,11 +38,11 @@ type KillStatisticsResponse struct {
3838
Information Information `json:"information"`
3939
}
4040

41-
func TibiaKillstatisticsImpl(world string, BoxContentHTML string) (*KillStatisticsResponse, error) {
41+
func TibiaKillstatisticsImpl(world string, BoxContentHTML string) (KillStatisticsResponse, error) {
4242
// Loading HTML data into ReaderHTML for goquery with NewReader
4343
ReaderHTML, err := goquery.NewDocumentFromReader(strings.NewReader(BoxContentHTML))
4444
if err != nil {
45-
return nil, fmt.Errorf("[error] TibiaKillstatisticsImpl failed at goquery.NewDocumentFromReader, err: %s", err)
45+
return KillStatisticsResponse{}, fmt.Errorf("[error] TibiaKillstatisticsImpl failed at goquery.NewDocumentFromReader, err: %s", err)
4646
}
4747

4848
// Creating empty KillStatisticsData var
@@ -76,7 +76,7 @@ func TibiaKillstatisticsImpl(world string, BoxContentHTML string) (*KillStatisti
7676

7777
//
7878
// Build the data-blob
79-
return &KillStatisticsResponse{
79+
return KillStatisticsResponse{
8080
KillStatistics{
8181
World: world,
8282
Entries: KillStatisticsData,

0 commit comments

Comments
 (0)