2 回答

TA贡献1847条经验 获得超7个赞
问题在这条线上:
highestVersion := fmt.Sprintf("%v",folders[len(folders)-1:])
该%v
格式说明,如一些人所说,是“价值”的简写。现在,让我们看一下您的价值:
folders[len(folders)-1:]
您在这里所说的是,“从头folders
开始len(folders-1)
”。您的变量是一个切片,仅包含中的最后一项folders
。
通过在值周围使用方括号来打印切片,并且由于您拥有一个值,因此它将打印由方括号括起来的值。
如果只想打印该位置中包含的浮点数,则应删除注释中指定的冒号。我建议您使用fmt动词%f
或进行打印%g
,具体取决于您的用例。
可以在pkg / fmt文档中找到有关哪些动词可用printf
以及其他相关功能的更多信息。

TA贡献1812条经验 获得超5个赞
一种可能的方法是使用正则表达式以确保每个路径都具有预期的格式,并通过子匹配(匹配组)将版本号提取为浮点,然后按其浮点版本号值对路径字符串进行排序并返回最高的。
例如:
func main() {
paths := []string{
`C:\Program Files\PostgreSQL\[1.2]\bin\psql.exe`,
`C:\Program Files\PostgreSQL\[9.6]\bin\psql.exe`,
`C:\Program Files\PostgreSQL\[10.1]\bin\psql.exe`,
`C:\Program Files\PostgreSQL\[7.2]\bin\psql.exe`,
}
sort.Slice(paths, func(i, j int) bool {
return parseVersion(paths[i]) >= parseVersion(paths[j])
})
fmt.Printf("OK: highest version path = %s\n", paths[0])
// OK: highest version path = C:\Program Files\PostgreSQL\[10.1]\bin\psql.exe
}
var re = regexp.MustCompile(`C:\\Program Files\\PostgreSQL\\\[(\d+\.\d+)\]\\bin\\psql.exe`)
func parseVersion(s string) float32 {
match := re.FindStringSubmatch(s)
if match == nil {
panic(fmt.Errorf("invalid path %q", s))
}
version, err := strconv.ParseFloat(match[1], 32)
if err != nil {
panic(err)
}
return float32(version)
}
当然,如果这对您的用例很重要,则可以修改路径正则表达式以匹配不同的位置模式。
- 2 回答
- 0 关注
- 255 浏览
添加回答
举报