你正在使用的Go版本是什么(go version
)?
go 1.9
这个问题在最新的版本中是否重现?
是的
你正在使用什么操作系统和处理器架构(go env
)?
amd64, darwin 和 linux。
你做了什么?
language.MustParse接受"lang_ZZ",例如en_ZZ,es_ZZ等,并返回一个有效的标签。但是m.Match(这样的语言标签)在这个查找表中触发了一个“索引超出范围”的恐慌:https://github.com/golang/text/blob/master/language/tables.go#L50
重现问题的示例代码:
package main
import (
"fmt"
"golang.org/x/text/language"
)
func main() {
supportedLanguages := []language.Tag{
language.English,
language.Arabic,
language.BritishEnglish,
language.Spanish,
language.French,
language.Italian,
language.Japanese,
language.Korean,
language.Portuguese,
language.Russian,
language.SimplifiedChinese,
language.TraditionalChinese,
}
tl := language.MustParse("en_ZZ")
fmt.Printf("target language: %v\n", tl)
m := language.NewMatcher(supportedLanguages)
_, idx, _ := m.Match(tl)
fmt.Printf("index matched: %v\n", idx)
}
输出:
target language: en-ZZ
panic: runtime error: index out of range
goroutine 1 [running]:
golang.org/x/text/language.regionGroupDist(0x139005701650135, 0x1650139)
/Users/yb/go_root/src/golang.org/x/text/language/match.go:677 +0x13d
golang.org/x/text/language.(*bestMatch).update(0xc42003fbf0, 0xc4200722d0, 0x1650139, 0x0, 0x0, 0x101650057)
/Users/ybi/go_root/src/golang.org/x/text/language/match.go:622 +0x28d
golang.org/x/text/language.(*matcher).getBest(0xc420072270, 0xc42000adc0, 0x1, 0x1, 0x0, 0x0, 0x0, 0x0, 0x0)
/Users/yb/go_root/src/golang.org/x/text/language/match.go:504 +0x4a0
golang.org/x/text/language.(*matcher).Match(0xc420072270, 0xc42000adc0, 0x1, 0x1, 0x0, 0x0, 0x1161220, 0xc420072270, 0x2d952e1a19cc2e08)
/Users/yb/go_root/src/golang.org/x/text/language/match.go:83 +0xd4
main.main()
/Users/yb/test.go:28 +0x4d5
exit status 2
你期望看到什么?
(1) language.MustParse拒绝"lang_ZZ"并抛出错误;
或者
(2) language.MustParse将"lang_ZZ"解析为仅包含"lang"的标签,类似于"lang_UND",例如language.MustParse("en_ZZ")和"en"应该返回相同的结果。
或者
(3) language.Matcher支持ZZ国家代码并正常工作。
你看到了什么?
language.MustParse接受ZZ,但language.Matcher在这一点上崩溃了。
5条答案
按热度按时间pieyvz9o1#
相同的错误在1.10.3 darwin/amd64中重复出现。由于索引错误导致失败:
zd287kbt2#
这仍然发生在1.11.1 darwin/amd64上。
e4yzc0pl3#
是的,因为它还没有固定。
/cc @mpvl
lnxxn5zx4#
这个问题是否已经修复了?现在已经过去一年了,我使用的是go1.12.4 darwin/amd64版本,但它仍然在我的代码中发生。
输入中到底出了什么问题?也许如果我知道输入中出了什么问题,我就可以筛选出来。
这是我们用于数百个不同人的生产代码,所以我不知道他们每个人发送的是什么内容。
1tu0hz3e5#
不熟悉这段代码,这可能只是一个更大的问题的症状,但看起来恐慌的原因是语言/tables.go文件中区域ToGroups字节数组中的一个字节被删除(意外地?)
golang/text@b85db4f#diff-9b4a7a0caec1562de30551ab14452668L3346
如果有人遇到这个问题,并想尝试一个hacky修复方法,只需fork这个仓库,在字节数组中添加一个额外的零字节。https://github.com/golang/text/blob/master/language/tables.go#L101 并使用fork的仓库