好像没区别,对吧? 来看个全面的对比:

package main

import (
    "fmt"
    "reflect"
)

func main(){
    asci:="abc"
    ch:="我是中国人"
    mix:="i am 中国人"
    fmt.Println(
        reflect.TypeOf(asci),
        reflect.TypeOf(ch),
        reflect.TypeOf(mix),
    )
    fmt.Println(
        reflect.TypeOf(asci[0]),
        reflect.TypeOf(ch[0]),
        reflect.TypeOf(mix[0]),
    )
    for i,v:=range asci{
        fmt.Println(reflect.TypeOf(asci[i]), reflect.TypeOf(v), string(v), string(asci[i]), )
        break
    }
    for i,v:=range ch{
    //ch[i]会乱码, 因为非ascii字符是不固定byte数,但go默认按1byte ,即8bits读取,这样明显破坏了UTF8的字符 fmt.Println(reflect.TypeOf(asci[i]), reflect.TypeOf(v),
string(v), string(ch[i])) break } for i,v:=range mix{ fmt.Println(reflect.TypeOf(asci[i]), reflect.TypeOf(v), string(v), string(mix[i])) break } }
string string string
uint8 uint8 uint8
uint8 int32 a a
uint8 int32 我 æ
uint8 int32 i i

  

总结 :

1.  for range 时会把 string[i]进行强制转换为 rune, 如果我们只需要byte,就多此一举了

2. 如果我们的string是非英文的字符,比如中文,那是默认按rune处理是非常稳妥的方式,不会有乱码。

01-19 20:35