Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/logging/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Go 为什么语言匹配器返回如此奇怪的结果?_Go_Http Accept Language - Fatal编程技术网

Go 为什么语言匹配器返回如此奇怪的结果?

Go 为什么语言匹配器返回如此奇怪的结果?,go,http-accept-language,Go,Http Accept Language,我正在基于Accept Language头实现一个多语言web服务。我使用下一个代码解析标头并获取请求的语言: var matcher = language.NewMatcher([]language.Tag{ language.English, language.Russian, }) header:="ru, RUS, ru-RU, ru-ru" tags, q, err := language.ParseAcceptLanguage(header) for key, tag

我正在基于
Accept Language
头实现一个多语言web服务。我使用下一个代码解析标头并获取请求的语言:

var matcher = language.NewMatcher([]language.Tag{
    language.English,
    language.Russian,
})
header:="ru, RUS, ru-RU, ru-ru"
tags, q, err := language.ParseAcceptLanguage(header)
for key, tag := range tags {
        matched, _, c := matcher.Match(tag)
        fmt.Printf("%s=>%f Matched as: %s (confidence: %s)\n", tag, q[key], matched, c)
    }
我得到的结果是

ru=>1.000000 Matched as: ru (confidence: Exact)
ru=>1.000000 Matched as: ru (confidence: Exact)
ru-RU=>1.000000 Matched as: ru-u-rg-ruzzzz (confidence: Exact)
ru-RU=>1.000000 Matched as: ru-u-rg-ruzzzz (confidence: Exact)
为什么“ru-ru”与奇怪的标签“ru-u-rg-ruzzz”匹配?如何将“ru-ru”匹配为“ru”?

在创建匹配器时,您需要添加“ru-ru”

var matcher = language.NewMatcher([]language.Tag{
    language.English,
    language.MustParse("ru-RU"),
    language.Russian,
})
当你传入一个区域,而它不在你的匹配器中时,它默认为,你在语言包中点击它

    } else if r := w.RegionID.String(); len(r) == 2 {
        // TODO: also filter macro and deprecated.
        tt, _ = tt.SetTypeForKey("rg", strings.ToLower(r)+"zzzz")
    }
如果您只想获取所需的语言,可以使用返回的匹配标记中的
Base
方法

matched, _, _ := matcher.Match(tag)
base, _ := matched.Base();
fmt.Println(base.String()) // will only print the language
使用
base.String()
将为您提供的所有语言标题打印
ru