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 關注
- 276 瀏覽
添加回答
舉報