Как манипулировать строками в GO, чтобы обратить их вспять? - PullRequest
0 голосов
/ 11 ноября 2018

Я пытаюсь инвертировать строку в го, но у меня проблемы с обработкой символов. В отличие от C, GO рассматривает строки как векторы байтов, а не символы, которые здесь называются рунами. Я пытался выполнить некоторые преобразования типов для выполнения заданий, но пока не смог.

Идея состоит в том, чтобы сгенерировать 5 строк со случайными символами размеров 100, 200, 300, 400 и 500, а затем инвертировать их символы. Мне удалось заставить C работать легко, но в GO язык возвращает ошибку, говорящую о невозможности выполнить назначение.

 func inverte() {
    var c = "A"
    var strs, aux string

    rand.Seed(time.Now().UnixNano())
    // Gera 5 vetores de 100, 200, 300, 400, e 500 caracteres
    for i := 1; i < 6; i++ {
        strs = randomString(i * 100)
        fmt.Print(strs)

        for i2, j := 0, len(strs); i2 < j; i2, j = i+1, j-1 {
           aux = strs[i2]
           strs[i2] = strs[j]
           strs[j] = aux
       }
   }
}

1 Ответ

0 голосов
/ 11 ноября 2018

Как вы правильно определили, строки go являются неизменяемыми , поэтому вы не можете присвоить значения руны / символа при заданных индексах.

Вместо того, чтобы перевернуть строку на месте, нужно создать копию рун в строке и вместо этого обратить их, а затем вернуть полученную строку.

Например ( Go Playground ):

func reverse(s string) string {
  rs := []rune(s)
  for i, j := 0, len(rs)-1; i < j; i, j = i+1, j-1 {
    rs[i], rs[j] = rs[j], rs[i]
  }
  return string(rs)
}

func main() {
  fmt.Println(reverse("Hello, World!"))
  // !dlroW ,olleH
  fmt.Println(reverse("Hello, 世界!"))
  // !界世 ,olleH
}

Существуют проблемы с этим подходом из-за сложностей Unicode (например, , объединяющих диакритические знаки ), но это поможет вам начать работу.

...