10

Go语言||字符数据类型 rune和byte

 3 years ago
source link: https://studygolang.com/articles/32400
Go to the source link to view the article. You can view the picture content, updated content and better typesetting reading experience. If the link is broken, please click the button below to view the snapshot at that time.

Go语言||字符数据类型 rune和byte

mb5fe94b3e552d9 · 大约5小时之前 · 20 次点击 · 预计阅读时间 1 分钟 · 不到1分钟之前 开始浏览    

概述

在学习使用golang时,发现字符数据类型比较奇怪,对其类型的意义不甚了解,于是查询了一波。

官方介绍


// rune is an alias for int32 and is equivalent to int32 in all ways. It is
// used, by convention, to distinguish character values from integer values.

//int32的别名,几乎在所有方面等同于int32
//它用来区分字符值和整数值

type rune = int32

rune是Go语言中一种特殊的数据类型,它是int32的别名,几乎在所有方面等同于int32,用于区分字符值和整数值。

补充:golang中的字符有两种,uint8(byte)代表ASCII的一个字符,rune代表一个utf-8字符。

理解:当需要处理中文、日文或者其他复合字符时,则需要用到rune类型,rune实际是一个int32.

举例说明


package main

import "fmt"

func main() {
  var str = "hello 你好"
  fmt.Println("len(str):", len(str))
  for i := 0; i < len(str); i++ {
    fmt.Printf("%c",str[i])
  }
}
//输出结果
hello ä½ å¥½

按照正常逻辑,“hello 你好”的长度应该是8,5个英文字符,一个空格,两个汉字。然而真正的输出结果却是12。

循环遍历输出结果也有问题,汉字部分输出乱码,但是依稀可以看出一个汉字占用三个字节。

查阅资料得知在golang中,汉字采用utf-8编码,占用三个字节,编码后的值是int类型。字母采用ASCII编码。那么如何获取有汉字的字符长度呢?

补充:若为gbk编码,则占用两个子节。

解决方案

采用for range遍历方法。


package main

import "fmt"

func main() {
  var str = "hello 你好"
  fmt.Println("len(str):", len(str))
  for _, v := range str {
    fmt.Printf("%c", v)
  }
}

//输出结果
hello 你好

分析可知for采用byte类型循环,for range采用rune类型循环

修改字符串

要修改字符串,需要先将其转换为rune或者byte类型,完成后再转换为string。无论哪种转换都会重新分配内存,并赋值字节数组。


package main

import "fmt"

func main() {
  var str = "hello"
  byteStr := []byte(str)
  byteStr[0] = 'H'
  fmt.Println(string(byteStr))

  var s = "你好吗"
  runeS := []rune(s)
  runeS[2] = '啊'
  fmt.Println(string(runeS))
}

//输出结果
Hello
你好啊

有汉字用rune,没汉字随意。


有疑问加站长微信联系(非本文作者)

280

About Joyk


Aggregate valuable and interesting links.
Joyk means Joy of geeK