internal: avoid allocation
In order to pass a value as a variadic argument, Go allocates a slice.
This slice needs to be on the heap if the method is an
interface method, as it is unknown whether the slice
will escape. This can be avoided by returning a pointer
instead of an interface.
Change-Id: I6f0cb9a0c512515815116f0d0a515813ee7afaf5
Reviewed-on: https://go-review.googlesource.com/30273
Run-TryBot: Marcel van Lohuizen <mpvl@golang.org>
TryBot-Result: Gobot Gobot <gobot@golang.org>
Reviewed-by: Nigel Tao <nigeltao@golang.org>
diff --git a/internal/match.go b/internal/match.go
index 03190b9..a67fcac 100644
--- a/internal/match.go
+++ b/internal/match.go
@@ -29,21 +29,23 @@
//
// A Match will indicate an Exact match if the language matches after
// canonicalization and High if the matched tag is a parent.
-func NewInheritanceMatcher(t []language.Tag) language.Matcher {
- tags := make(inheritanceMatcher)
+func NewInheritanceMatcher(t []language.Tag) *InheritanceMatcher {
+ tags := &InheritanceMatcher{make(map[language.Tag]int)}
for i, tag := range t {
ct, err := language.All.Canonicalize(tag)
if err != nil {
ct = tag
}
- tags[ct] = i
+ tags.index[ct] = i
}
return tags
}
-type inheritanceMatcher map[language.Tag]int
+type InheritanceMatcher struct {
+ index map[language.Tag]int
+}
-func (m inheritanceMatcher) Match(want ...language.Tag) (language.Tag, int, language.Confidence) {
+func (m InheritanceMatcher) Match(want ...language.Tag) (language.Tag, int, language.Confidence) {
for _, t := range want {
ct, err := language.All.Canonicalize(t)
if err != nil {
@@ -51,7 +53,7 @@
}
conf := language.Exact
for {
- if index, ok := m[ct]; ok {
+ if index, ok := m.index[ct]; ok {
return ct, index, conf
}
if ct == language.Und {