stringgoinversionreversion

How to manipulate strings in GO to reverse them?


I'm trying to invert a string in go but I'm having trouble handling the characters. Unlike C, GO treats strings as vectors of bytes, rather than characters, which are called runes here. I tried to do some type conversions to do the assignments, but so far I could not.

The idea here is to generate 5 strings with random characters of sizes 100, 200, 300, 400 and 500 and then invert their characters. I was able to make C work with ease, but in GO, the language returns an error saying that it is not possible to perform the assignment.

 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
       }
   }
}

Solution

  • As you correctly identified, go strings are immutable, so you cannot assign to rune/character values at given indices.

    Instead of reversing the string in-place one must create a copy of the runes in the string and reverse those instead, and then return the resulting string.

    For example (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
    }
    

    There are problems with this approach due to the intricacies of Unicode (e.g. combining diacritical marks) but this will get you started.