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

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]), string(asci[:3]) )
break
}
for i,v:=range ch{
fmt.Println(reflect.TypeOf(asci[i]), reflect.TypeOf(v),string(v), string(ch[i]), string(ch[:3]))
break
}
for i,v:=range mix{
fmt.Println(reflect.TypeOf(asci[i]), reflect.TypeOf(v), string(v), string(mix[i]), string(mix[:3]))
break
}

string string string
uint8 uint8 uint8
uint8 int32 a a abc
uint8 int32 我 æ 我
uint8 int32 i i i a

分析:

原来是 byte 表示一个字节,rune 表示四个字节,相当于4个byte,可以存放utf8字符。

由此,string[i]可能不是ascii,就显示成乱码。

    s := "截取中文"
//试试这样能不能截取?
fmt.Println(s[:])

明显是不能的。

正确做法:

    fmt.Println(string([]rune(s)[:]))
截取中

总结 :

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

2. 默认按rune处理是非常稳妥的方式,不会有乱码。

3. string默认按[]byte进行解析,对含非ascii string的slice操作会产生乱码,需要转成rune.

最新文章

  1. 教你安装CentOS 6.5如何选择安装包
  2. Oracle 递归函数与等级
  3. yii项目开发项目常用技巧和方法汇总
  4. 装有Win7系统的电脑在局域网不能共享的解决方案
  5. .NET3.5中的高性能 Socket API
  6. Unity扩展编辑器--类型3:Custom Editors
  7. Webform Lable
  8. 链接分析算法之:HillTop算法
  9. C# 添加枚举中文资源
  10. distributed computing_the World Wide Web
  11. linux rsync介绍(八)
  12. String源码详解
  13. BZOJ3512 DZY Loves Math IV(杜教筛+线性筛)
  14. 【软工实践】第四次作业--爬虫结合WordCount
  15. Activex 数字签名
  16. Python中多维数组flatten的技巧
  17. asp.net mvc 4.0常见的几个问题
  18. 【python】使用枚举类
  19. 使用Sublime经验分享
  20. Python常用的标准库以及第三方库有哪些?

热门文章

  1. Navicat Premium 详解
  2. jmeter压测学习5-XPath提取器
  3. 201871010105-曹玉中《面向对象程序设计(java)》第十五周学习总结
  4. 201871010118-唐敬博《面向对象程序设计(java)》第十一周学习总结
  5. 283.移动零 关于列表list与remove原理*****(简单)
  6. style="position: relative;left:-5px; top: -5px;"
  7. 【oracle】oracle11g安装失败 提示找不到文件,模板General_Purpose.dbc不存在
  8. 清理C盘临时文件脚本
  9. Mysql查询数据库状态及信息
  10. bootstrap-table 列拖动