How to reverse a string in Go?

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

How can we reverse a simple string in Go?

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

    This code preserves sequences of combining characters intact, and should work with invalid UTF-8 input too.

    package stringutil
    import "code.google.com/p/go.text/unicode/norm"
    
    func Reverse(s string) string {
        bound := make([]int, 0, len(s) + 1)
    
        var iter norm.Iter
        iter.InitString(norm.NFD, s)
        bound = append(bound, 0)
        for !iter.Done() {
            iter.Next()
            bound = append(bound, iter.Pos())
        }
        bound = append(bound, len(s))
        out := make([]byte, 0, len(s))
        for i := len(bound) - 2; i >= 0; i-- {
            out = append(out, s[bound[i]:bound[i+1]]...)
        }
        return string(out)
    }
    

    It could be a little more efficient if the unicode/norm primitives allowed iterating through the boundaries of a string without allocating. See also https://code.google.com/p/go/issues/detail?id=9055 .

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

    This works, without all the mucking about with functions:

    func Reverse(s string) (result string) {
      for _,v := range s {
        result = string(v) + result
      }
      return 
    }
    
    0 讨论(0)
  • 2020-12-04 07:38

    It's assuredly not the most memory efficient solution, but for a "simple" UTF-8 safe solution the following will get the job done and not break runes.

    It's in my opinion the most readable and understandable on the page.

    func reverseStr(str string) (out string) {
        for _, s := range str {
            out = string(s) + out
        }
    
        return
    }
    
    0 讨论(0)
  • 2020-12-04 07:38

    NOTE: This answer is from 2009, so there are probably better solutions out there by now.


    Looks a bit 'roundabout', and probably not very efficient, but illustrates how the Reader interface can be used to read from strings. IntVectors also seem very suitable as buffers when working with utf8 strings.

    It would be even shorter when leaving out the 'size' part, and insertion into the vector by Insert, but I guess that would be less efficient, as the whole vector then needs to be pushed back by one each time a new rune is added.

    This solution definitely works with utf8 characters.

    package main
    
    import "container/vector";
    import "fmt";
    import "utf8";
    import "bytes";
    import "bufio";
    
    
    func
    main() {
        toReverse := "Smørrebrød";
        fmt.Println(toReverse);
        fmt.Println(reverse(toReverse));
    }
    
    func
    reverse(str string) string {
        size := utf8.RuneCountInString(str);
        output := vector.NewIntVector(size);
        input := bufio.NewReader(bytes.NewBufferString(str));
        for i := 1; i <= size; i++ {
            rune, _, _ := input.ReadRune();
            output.Set(size - i, rune);
        }
        return string(output.Data());
    }
    
    0 讨论(0)
提交回复
热议问题