请选择 进入手机版 | 继续访问电脑版

 找回密码
 立即注册
搜索
查看: 304|回复: 0

[go基础] Go语言基本数据类型 | Byte和rune类型

  [复制链接]
匿名
匿名  发表于 2023-2-8 16:31 |阅读模式

对基本数据类型的理解不够彻底,看到这个文章,记录加深理解。

组成每个字符串的元素叫做“字符”,可以通过遍历或者单个获取字符串元素获得字符。 字符用单引号(’)包裹起来,如:



    var a := '中'
    var b := 'x'

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

    uint8类型,或者叫 byte 型,代表了ASCII码的一个字符。
    rune类型,代表一个 UTF-8字符。

byte和rune类型

当需要处理中文、日文或者其他复合字符时,则需要用到rune类型。

rune类型实际是一个int32。

Go 使用了特殊的 rune 类型来处理 Unicode,让基于 Unicode的文本处理更为方便,也可以使用 byte 型进行默认字符串处理,性能和扩展性都有照顾。

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
    // 遍历字符串
    func traversalString() {
        s := "pprof.cn博客"
        for i := 0; i < len(s); i++ { //byte
            fmt.Printf("%v(%c) ", s[i], s[i])
        }
        fmt.Println()
        for _, r := range s { //rune
            fmt.Printf("%v(%c) ", r, r)
        }
        fmt.Println()
    }

输出结果:

    112(p) 112(p) 114(r) 111(o) 102(f) 46(.) 99(c) 110(n) 229(å) 141() 154() 229(å) 174(®) 162(¢)
    112(p) 112(p) 114(r) 111(o) 102(f) 46(.) 99(c) 110(n) 21338(博) 23458(客)

因为UTF8编码下一个中文汉字由3~4个字节组成,所以我们不能简单的按照字节去遍历一个包含中文的字符串,否则就会出现上面输出中第一行的结果。

字符串底层是一个byte数组,所以可以和[]byte类型相互转换。

字符串是不能修改的、字符串是由byte字节组成,所以字符串的长度是byte字节的长度。

rune类型用来表示utf8字符,一个rune字符由一个或多个byte组成。

修改字符串

要修改字符串,需要先将其转换成[]rune或[]byte,完成后再转换为string。

无论哪种转换,都会重新分配内存,并复制字节数组。

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
    func changeString() {
        s1 := "hello"
        // 强制类型转换
        byteS1 := []byte(s1)
        byteS1[0] = 'H'
        // 修改完成后,再强转为 string
        fmt.Println(string(byteS1))
        s2 := "博客"
        runeS2 := []rune(s2)
        runeS2[0] = '狗'
      	// 修改完成后,再强转为 string
        fmt.Println(string(runeS2))
    }

类型转换

Go语言中只有强制类型转换,没有隐式类型转换。该语法只能在两个类型之间支持相互转换的时候使用。

强制类型转换的基本语法如下:

    T(表达式)

其中,

  • T 表示要转换的类型。
  • 表达式 包括变量、复杂算子和函数返回值等。

比如计算直角三角形的斜边长时使用math包的Sqrt()函数,该函数接收的是float64类型的参数,而变量a和b都是int类型的,这个时候就需要将a和b强制类型转换为float64类型。

1
2
3
4
5
6
7
    func sqrtDemo() {
        var a, b = 3, 4
        var c int
        // math.Sqrt()接收的参数是float64类型,需要强制转换
        c = int(math.Sqrt(float64(a*a + b*b)))
        fmt.Println(c)
    }

 

原文地址:http://www.manoner.com/post/GoLand/Go%E8%AF%AD%E8%A8%80%E5%9F%BA%E6%9C%AC%E6%95%B0%E6%8D%AE%E7%B1%BB%E5%9E%8B-byte%E5%92%8Crune%E7%B1%BB%E5%9E%8B/

 

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

Archiver|手机版|小黑屋|学习笔记

GMT+8, 2024-10-8 10:17 , Processed in 0.026068 second(s), 13 queries , APCu On.

Powered by Discuz! X3.5

© 2001-2024 Discuz! Team.

快速回复 返回顶部 返回列表