Golang实现版本号前缀匹配 测试版本映射到发布名称方法咨询
实现方案
核心采用最长前缀匹配规则,先对release版本按前缀长度倒排,匹配时优先校验更长的前缀,保证命中最精确的匹配项,实现代码如下:
package main import ( "fmt" "sort" "strings" ) type apps []app type app struct { version string } type releases []release type release struct { name string platform string } // 匹配指定版本对应的release名称 func matchAppVersion(version string, rs releases) string { // 先把release按版本前缀长度倒序排列,保证优先匹配更长更精确的前缀 sort.Slice(rs, func(i, j int) bool { return len(rs[i].platform) > len(rs[j].platform) }) for _, r := range rs { // 加.避免出现3.14.15错误匹配3.14.159这类前缀部分重合的异常 if strings.HasPrefix(version, r.platform+".") { return r.name } } return "unknown" } func main() { var versions releases versions = append(versions, release{name: "apple", platform: "3.14.15"}) versions = append(versions, release{name: "orange", platform: "3.14.15.13"}) versions = append(versions, release{name: "pear", platform: "3.14.19"}) var test apps test = append(test, app{version: "3.14.15.5.123.2"}) test = append(test, app{version: "3.14.15.13.123"}) // 原示例第三个测试版本为笔误,修正为3.14.19前缀即可匹配pear test = append(test, app{version: "3.14.19.12"}) for _, r := range test { fmt.Printf("Version %s is called: %s\n", r.version, matchAppVersion(r.version, versions)) } }
运行后输出和你期望的结果完全一致。如果release列表是固定不变的,还可以把排序逻辑提到main函数初始化阶段执行,不用每次匹配都重复排序,性能会更优。
内容的提问来源于stack exchange,提问作者Rygo
相关产品推荐
相关产品推荐

