1 回答

TA貢獻1829條經驗 獲得超9個贊
您的意圖是增加最后一個符文表示的數字,因此您應該這樣做:解析該數字,將其增加為數字,然后將其“重新編碼”為字符串。
您不能對單個符文進行操作,因為一旦數量達到10
,就只能使用 2 個符文來表示。另一個問題是,如果最后一個數字是19
,增加它需要改變以前的符文(而不是添加新的符文)。
解析數字并重新編碼比人們想象的要容易得多。
您可以利用fmt
包的fmt.Sscanf()
功能fmt.Sprintf()
。解析和重新編碼只是一個函數調用。
讓我們將此功能包裝到一個函數中:
const format = "version-%d.%d.%d-%d"
func incLast(s string) (string, error) {
? ? var a, b, c, d int
? ? if _, err := fmt.Sscanf(s, format, &a, &b, &c, &d); err != nil {
? ? ? ? return "", err
? ? }
? ? d++
? ? return fmt.Sprintf(format, a, b, c, d), nil
}
測試它:
s := "version-1.1.0-8"
for i := 0; i < 13; i++ {
? ? var err error
? ? if s, err = incLast(s); err != nil {
? ? ? ? panic(err)
? ? }
? ? fmt.Println(s)
}
輸出(在Go Playground上嘗試):
version-1.1.0-9
version-1.1.0-10
version-1.1.0-11
version-1.1.0-12
version-1.1.0-13
version-1.1.0-14
version-1.1.0-15
version-1.1.0-16
version-1.1.0-17
version-1.1.0-18
version-1.1.0-19
version-1.1.0-20
version-1.1.0-21
另一種選擇是只解析和重新編碼最后一部分,而不是完整的版本文本。這就是它的樣子:
func incLast2(s string) (string, error) {
? ? i := strings.LastIndexByte(s, '-')
? ? if i < 0 {
? ? ? ? return "", fmt.Errorf("invalid input")
? ? }
? ? d, err := strconv.Atoi(s[i+1:])
? ? if err != nil {
? ? ? ? return "", err
? ? }
? ? d++
? ? return s[:i+1] + strconv.Itoa(d), nil
}
測試和輸出是一樣的。在Go Playground試試這個。
- 1 回答
- 0 關注
- 149 瀏覽
添加回答
舉報