How to reverse a string in Go?

前端 未结 28 1892
天涯浪人
天涯浪人 2020-12-04 06:45

How can we reverse a simple string in Go?

相关标签:
28条回答
  • 2020-12-04 07:29

    Here is yet another solution:

    func ReverseStr(s string) string {
        chars := []rune(s)
        rev := make([]rune, 0, len(chars))
        for i := len(chars) - 1; i >= 0; i-- {
            rev = append(rev, chars[i])
        }
        return string(rev)
    }
    

    However, yazu's solution above is more elegant since he reverses the []rune slice in place.

    0 讨论(0)
  • 2020-12-04 07:29
        func reverseString(someString string) string {
            runeString := []rune(someString)
            var reverseString string
            for i := len(runeString)-1; i >= 0; i -- {
                reverseString += string(runeString[i])
            }
            return reverseString
        }
    
    0 讨论(0)
  • 2020-12-04 07:30

    If you need to handle grapheme clusters, use unicode or regexp module.

    package main
    
    import (
      "unicode"
      "regexp"
    )
    
    func main() {
        str := "\u0308" + "a\u0308" + "o\u0308" + "u\u0308"
        println("u\u0308" + "o\u0308" + "a\u0308" + "\u0308" == ReverseGrapheme(str))
        println("u\u0308" + "o\u0308" + "a\u0308" + "\u0308" == ReverseGrapheme2(str))
    }
    
    func ReverseGrapheme(str string) string {
    
      buf := []rune("")
      checked := false
      index := 0
      ret := "" 
    
        for _, c := range str {
    
            if !unicode.Is(unicode.M, c) {
    
                if len(buf) > 0 {
                    ret = string(buf) + ret
                }
    
                buf = buf[:0]
                buf = append(buf, c)
    
                if checked == false {
                    checked = true
                }
    
            } else if checked == false {
                ret = string(append([]rune(""), c)) + ret
            } else {
                buf = append(buf, c)
            }
    
            index += 1
        }
    
        return string(buf) + ret
    }
    
    func ReverseGrapheme2(str string) string {
        re := regexp.MustCompile("\\PM\\pM*|.")
        slice := re.FindAllString(str, -1)
        length := len(slice)
        ret := ""
    
        for i := 0; i < length; i += 1 {
            ret += slice[length-1-i]
        }
    
        return ret
    }
    
    0 讨论(0)
  • 2020-12-04 07:32

    I noticed this question when Simon posted his solution which, since strings are immutable, is very inefficient. The other proposed solutions are also flawed; they don't work or they are inefficient.

    Here's an efficient solution that works, except when the string is not valid UTF-8 or the string contains combining characters.

    package main
    
    import "fmt"
    
    func Reverse(s string) string {
        n := len(s)
        runes := make([]rune, n)
        for _, rune := range s {
            n--
            runes[n] = rune
        }
        return string(runes[n:])
    }
    
    func main() {
        fmt.Println(Reverse(Reverse("Hello, 世界")))
        fmt.Println(Reverse(Reverse("The quick brown 狐 jumped over the lazy 犬")))
    }
    
    0 讨论(0)
  • 2020-12-04 07:32

    For simple strings it possible to use such construction:

    func Reverse(str string) string {
        if str != "" {
            return Reverse(str[1:]) + str[:1]
        }
        return ""   
    }
    
    0 讨论(0)
  • 2020-12-04 07:34

    Russ Cox, on the golang-nuts mailing list, suggests

    package main 
    import "fmt"
    func main() { 
            input := "The quick brown 狐 jumped over the lazy 犬" 
            // Get Unicode code points. 
            n := 0
            rune := make([]rune, len(input))
            for _, r := range input { 
                    rune[n] = r
                    n++
            } 
            rune = rune[0:n]
            // Reverse 
            for i := 0; i < n/2; i++ { 
                    rune[i], rune[n-1-i] = rune[n-1-i], rune[i] 
            } 
            // Convert back to UTF-8. 
            output := string(rune)
            fmt.Println(output)
    }
    
    0 讨论(0)
提交回复
热议问题