好像没区别,对吧? 来看个全面的对比:
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处理是非常稳妥的方式,不会有乱码。