How to reverse a string in Go?

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

How can we reverse a simple string in Go?

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

    try below code:

    package main
    
    import "fmt"
    
    func reverse(s string) string {
        chars := []rune(s)
        for i, j := 0, len(chars)-1; i < j; i, j = i+1, j-1 {
            chars[i], chars[j] = chars[j], chars[i]
        }
        return string(chars)
    }
    
    func main() {
        fmt.Printf("%v\n", reverse("abcdefg"))
    }
    

    for more info check http://golangcookbook.com/chapters/strings/reverse/
    and http://www.dotnetperls.com/reverse-string-go

    0 讨论(0)
  • 2020-12-04 07:19

    You could also import an existing implementation:

    import "4d63.com/strrev"
    

    Then:

    strrev.Reverse("abåd") // returns "dåba"
    

    Or to reverse a string including unicode combining characters:

    strrev.ReverseCombining("abc\u0301\u031dd") // returns "d\u0301\u031dcba"
    

    These implementations supports correct ordering of unicode multibyte and combing characters when reversed.

    Note: Built-in string reverse functions in many programming languages do not preserve combining, and identifying combining characters requires significantly more execution time.

    0 讨论(0)
  • 2020-12-04 07:20
    //Reverse reverses string using strings.Builder. It's about 3 times faster
    //than the one with using a string concatenation
    func Reverse(in string) string {
        var sb strings.Builder
        runes := []rune(in)
        for i := len(runes) - 1; 0 <= i; i-- {
            sb.WriteRune(runes[i])
        }
        return sb.String()
    }
    
    
    //Reverse reverses string using string
    func Reverse(in string) (out string) {
        for _, r := range in {
            out = string(r) + out
        }
        return
    }
    
    BenchmarkReverseStringConcatenation-8   1000000 1571 ns/op  176 B/op    29 allocs/op
    BenchmarkReverseStringsBuilder-8        3000000 499 ns/op   56 B/op 6 allocs/op
    

    Using strings.Builder is about 3 times faster than using string concatenation

    0 讨论(0)
  • 2020-12-04 07:21

    Here is quite different, I would say more functional approach, not listed among other answers:

    func reverse(s string) (ret string) {
        for _, v := range s {
            defer func(r rune) { ret += string(r) }(v)
        }
        return
    }
    
    0 讨论(0)
  • 2020-12-04 07:22
    func Reverse(s string) string {
        r := []rune(s)
        var output strings.Builder
        for i := len(r) - 1; i >= 0; i-- {
            output.WriteString(string(r[i]))
        }
    
        return output.String()
    }
    
    0 讨论(0)
  • 2020-12-04 07:23

    A version which I think works on unicode. It is built on the utf8.Rune functions:

    func Reverse(s string) string {
        b := make([]byte, len(s));
        for i, j := len(s)-1, 0; i >= 0; i-- {
            if utf8.RuneStart(s[i]) {
                rune, size := utf8.DecodeRuneInString(s[i:len(s)]);
                utf8.EncodeRune(rune, b[j:j+size]);
                j += size;
            }
        }
        return string(b);
    }
    
    0 讨论(0)
提交回复
热议问题