go语言字符类型byte与rune

字符串中的每一个元素叫做“字符”,在遍历或者单个获取字符串元素时可以获得字符。
 

Go语言的字符有以下两种:

  • 一种是 byte 型,是 uint8 的别名,代表了 ASCII 码的一个字符。
  • 另一种是 rune 类型,代表一个 UTF-8 字符,当需要处理中文、日文或者其他复合字符时,则需要用到 rune 类型。rune 类型等价于 int32 类型。

字符集

Unicode 与 ASCII 类似,都是一种字符集。
字符集为每个字符分配一个唯一的 ID,我们使用到的所有字符在 Unicode 字符集中都有一个唯一的 ID,例如上面例子中的 a 在 Unicode 与 ASCII 中的编码都是 97。汉字“你”在 Unicode 中的编码为 20320,在不同国家的字符集中,字符所对应的 ID 也会不同。

案例

package main

import "fmt"

/*
	尝试使用索引遍历字符串,来更新字符串中的个别字符,是不允许的。
	string 类型的值是只读的二进制 byte slice,如果真要修改字符串中的字符,将 string 转为 []byte 修改后,再转为 string 即可
*/

func main()  {
	s1 := "Hello"

	// bad
	//s1[1] = 'a'

	// good
	sBytes := []byte(s1)
	sBytes[1] = 'a'
	s2 := string(sBytes)

	fmt.Println(s2) //Hallo
}
package main

import "fmt"

/*
	之前的示例并不是更新字符串的正确姿势,因为一个 UTF8 编码的字符可能会占多个字节,比如汉字就需要 3~4个字节来存储,此时更新其中的一个字节是错误的。
	更新字串的正确姿势:将 string 转为 rune slice(此时 1 个 rune 可能占多个 byte),直接更新 rune 中的字符
*/

func main()  {
	s1 := "Hello"

	// bad
	//sBytes := []byte(s1)
	//sBytes[1] = '嗨'

	// good
	sBytes := []rune(s1)
	sBytes[1] = '嗨'
	s2 := string(sBytes)

	fmt.Println(s2) //H嗨llo
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值