go 中string[0]到底是rune还是byte?
时间:2022-07-23
本文章向大家介绍go 中string[0]到底是rune还是byte?,主要内容包括其使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。
好像没区别,对吧? 来看个全面的对比:
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[:3])
截
明显是不能的。
正确做法:
fmt.Println(string([]rune(s)[:3]))
截取中
总结 :
1. for range 时会把 string[i]进行强制转换为 rune, 如果我们只需要byte,就多此一举了.
2. 默认按rune处理是非常稳妥的方式,不会有乱码。
3. string默认按[]byte进行解析,对含非ascii string的slice操作会产生乱码,需要转成rune.
- 【Spring实战】—— 15 Spring JDBC模板使用
- 前端开发总览
- 【Spring实战】—— 16 基于JDBC持久化的事务管理
- 【Spring实战】—— 4 Spring中bean的init和destroy方法讲解
- 基于AngularJS的过滤与排序
- 【Spring实战】—— 5 设值注入
- 科学家预测:未来100万年人类将变成半机械人类
- 【Spring实战】—— 8 自动装配
- 【Spring实战】—— 7 复杂集合类型的注入
- 【Spring实战】—— 6 内部Bean
- 几款可替代Dreamweaver的HTML5开发工具
- Linux下的Telnet设置方法介绍
- 2017年11月互联网和相关服务业保持快速增长
- 深度学习胸部x射线
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- Android UI设计与开发之ViewPager介绍和简单实现引导界面
- Android RollPagerView实现轮播图
- Android UI设计与开发之使用ViewPager实现欢迎引导页面
- Android ListView里控件添加监听方法的实例详解
- Android实现底部图片选择Dialog
- AndroidImageSlider实现炫酷轮播广告效果
- Android获取手机本机号码的实现方法
- Android中RecyclerView的item宽高问题详解
- Andoroid实现底部图片选择Dialog效果
- Android中ExpandableListView使用示例详解
- Android 高德地图之poi搜索功能的实现代码
- Android实现底部弹出按钮菜单升级版
- Android实现单页面浮层可拖动view的示例代码
- 漫画:最长公共子序列
- RecyclerView的简单使用