go 语言字符类型 byte 与 rune示例浅谈

本文主要介绍了go 语言字符类型 byte 与 rune案例详解,本文通过实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下

golang的字符有如下两种:

  • 一种是 uint8['ju:nɪt] 类型叫做 byte 型,代表了 ASCII 码的一个字符。
  • 另一种是 rune[ruːn] 类型,代表一个 UTF-8 字符,当需要处理中文、日文或者其他复合字符时,则需要用到 rune 类型。rune 类型等价于 int32 类型。

一、byte类型介绍

byte 类型是 uint8 的别名,可以表达只占用 1 个字节的传统 ASCII 编码的字符,例如 var c byte = 'A'

用单引号括起来的单个字符是字符类型,用双引号括起来的字符是字符串类型

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

package main

import "fmt"

func main(){

    var c byte = 'A'

    fmt.Println(c)

    fmt.Printf("%T ",c)

    fmt.Printf("\n")

    var d rune = 'A'

    fmt.Println(d)

    fmt.Printf("%T ",d)

    // var e byte = 'AB' // more than one character in rune literal

    // var e rune = 'AB'  // more than one character in rune literal

    var e string = "AB"

    fmt.Println(e)

    fmt.Printf("%T ",e)

    fmt.Printf("\n")

    var f byte = 'C'

    println(f)

    f = 88

    println(f)

}

// 结果如下

65

uint8

65

int32

AB

string

67

88

二、rune类型介绍

  • 在书写 Unicode 字符时,需要在 16 进制数之前加上前缀\u或者\U
  • Unicode 至少占用 2 个字节,所以我们使用 int16 或者 int 类型来表示。
  • 需要使用到 4 字节,则使用\u前缀,如果需要使用到 8 个字节,则使用\U前缀。

1

2

3

4

var h int = '\u0041'

fmt.Println(h)   // 65

var i int = '\U00000041'

fmt.Println(i)   // 65

三、遍历含有中文(Unicode)时差异

3.1、遍历打印一个字符串,当使用byte类型时:

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

package main

import "fmt"

func main(){

    str:="hello 世界"

    for i:=0;i<len(str);i++{

        fmt.Printf("%c",str[i]) // hello ä¸ç

        fmt.Printf("\n")

    }

}

// 结果如下:

h

e

l

l

o

  

ä

¸

ç

上面结果,英文字符正确打印,但中文乱码。是因为UTF8编码下一个中文汉字由3~4个字节组成,而字符串是由byte字节组成,所以长度也是byte字符长度,这样遍历时遇到中文就乱码了。

3.2、使用rune 类型来遍历字符串

在 Go 中,有一个遍历方式是 range,它默认就是以 UTF-8 编码形式去读每一个字符。当涉及到的字符串中含有非英文字符时,可以使用 range 来遍历:

1

2

3

4

5

6

7

8

104

101

108

108

111

32

19990

30028

此时输出的字节编码就是 UTF-8 编码号,UTF-8 编码是包含 ASCII 编码的,所以前 6 个编号还是一样的,后面两个编号分别代表世,界。

四、go 语言字符串修改

所谓对字符串的修改其实不是对字符串本身的修改,而是复制字符串,同时修改值,即重新分配来内存。

在go中修改字符串,需要先将字符串转化成数组,[]byte 或 []rune,然后再转换成 string型。

4.1、对于全是ASCII编码的字符串:

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

package main

import "fmt"

func main(){

    str:="hello"

    fmt.Println(str)

    s1:=[]byte(str)

    s1[0]='H'

    fmt.Println(string(s1))

}

// 结果如下

hello

Hello

4.2、对于包含非ASCII编码的字符串:

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

package main

import "fmt"

func main(){

    str01:="hello 世界"

    fmt.Println(str01)

    s2:=[]rune(str01)

    s2[0]='H'

    fmt.Println(string(s2))

}

// 结果如下

hello 世界

Hello 世界

到此这篇关于go 语言字符类型 byte 与 rune案例详解的文章就介绍到这了,希望可以帮到你。

来源:微点阅读   https://www.weidianyuedu.com

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值