题目来源
辅助阅读

我们都知道string和slice相似,都是一个结构体,引用了底层数组,并记录了自身的长度等信息。

在开始做这题前,你应该明白的几个知识点,string、rune、byte以及中文在string中的存储。

string的底层其实就是字节数组,也就是uint8,表示的范围有限,因此如果要正确的表示一个汉字(3个字节,Unicode),那么这个数组就会比正常的要长三倍。

在go中还有这么一个类型rune,它是int32的别名,能完整表示Unicode的所有码点,为什么不用int呢,int也是32位呀,但是int在go中,如果是32位系统它是4字节,64位系统是4字节。也就是说这是不确定的

因为byte和rune本质上没有区别,只是范围不一样,那么我们可以用rune将string转为rune数组。接着遍历数组交换头尾两个位置就行了

类似的截取带有中文的string时,一样会得到预期以外的结果。因为只截取了部分的数据,并不完整

package main

import (
    "fmt"
    "os"
    "bufio"
)

func main() {

    var s string

    reader := bufio.NewReader(os.Stdin)
    fmt.Fscan(reader, &s)

    tmp := []rune(s)

    length := len(tmp)

    for i := range tmp {
        if i == length / 2 {
            break;
        }

        tmp[i], tmp[length - i - 1] = tmp[length - i - 1], tmp[i]
    }

    fmt.Println(string(tmp))

}