解题思路: 以字符串中间字符为中心,遍历交换前后字符来达到翻转的目的, 任何语言都可以这样实现。
我们只需要求出字符串到长度就可以了,请看下面的例子:
str := "hello世界"
fmt.Println(len(str))
运行结果:
11
是不是跟你想象的有点不一样。我们都知道在golang中字符串是由[]byte实现的, 求字符串的长度就是求字节数组的长度,而一个中文字符在unicode下占2个字节,在utf-8中占三个字节,golang的默认编码就是utf-8。所以hello世界
的长度为11。
那我们如何求我们想要的字符串长度呢?
str := "hello世界"
// 方法一
strArr := []rune(str)
fmt.Println(len(strArr))
// 方法二
fmt.Println(utf8.RuneCountInString(str)) // 调用 unicode/utf8 标准库
运行结果:
7
7
方法一中,我们把字符串转成一个rune数组,rune是个啥?我们看下官方解释
// rune is an alias for int32 and is equivalent to int32 in all ways. It is
// used, by convention, to distinguish character values from integer values.
type rune = int32
从golang源码中看出,它是int32的别名,对于byte(-128~127),可表示的字符更多。
话不多说,我们回到主题翻转字符串:
package main
import "fmt"
func ReverseString(str string) string {
strArr := []rune(str)
for i := 0; i < len(strArr)/2; i++ {
strArr[len(strArr)-1-i], strArr[i] = strArr[i], strArr[len(strArr)-1-i]
}
return string(strArr)
}
func main() {
str := "hello世界"
fmt.Println(ReverseString(str))
}
运行结果:
界世olleh