Ваше намерение состоит в том, чтобы увеличить число, представленное последней руной, поэтому вы должны сделать это: проанализировать это число, увеличить его как число и «перекодировать» его в строку.
Выне может работать на одной руне, так как, когда число достигает 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 .