August Rush

一个还在努力成长的小火汁!

游龙当归海,海不迎我自来也。

We create our own demons.

You can reach me at augustrush0923@gmail.com
Go语言基础-byte和rune类型
发布:2021年01月15日 | 作者:augustrush | 阅读量: 323

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

如:

var a := 65

var b := 66

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

  1. uint8类型,或者叫 byte 型,代表了ASCII码的一个字符。

  2. rune类型,代表一个 UTF-8字符。


byte

byte,占用1个节字,就 8 个比特位(2^8 = 256,因此 byte 的表示范围 0->255),所以它和 uint8 类型本质上没有区别,它表示的是 ACSII 表中的一个字符。

如下这段代码,分别定义了 byte 类型和 uint8 类型的变量 a 和 b

import "fmt"

func main() {
    var a byte = 65
    // 8进制写法: var a byte = '\101'     其中 \ 是固定前缀
    // 16进制写法: var a byte = '\x41'    其中 \x 是固定前缀

    var b uint8 = 66
    fmt.Printf("a 的值: %c \nb 的值: %c", a, b)

    // 或者使用 string 函数
    // fmt.Println("a 的值: ", string(a)," \nb 的值: ", string(b))
}


rune

rune,占用4个字节,共32位比特位,所以它和 uint32本质上也没有区别。它表示的是一个 Unicode字符(Unicode是一个可以表示世界范围内的绝大部分字符的编码规范)。

import (
    "fmt"
    "unsafe"
)

func main() {
    var a byte = 'A'
    var b rune = 'B'
    fmt.Printf("a 占用 %d 个字节数\nb 占用 %d 个字节数", unsafe.Sizeof(a), unsafe.Sizeof(b))
}

/*
输出的结果为:
        a 占用 1 个字节数
        b 占用 4 个字节数
*/

由于 byte 类型能表示的值是有限,只有 2^8=256 个。所以如果你想表示中文的话,你只能使用 rune 类型。

字符串底层是一个byte数组,所以可以和[]byte类型相互转换。字符串是不能修改的 字符串是由byte字节组成,所以字符串的长度是byte字节的长度。 rune类型用来表示utf8字符,一个rune字符由一个或多个byte组成。


修改字符串

要修改字符串,需要先将其转换成[]rune[]byte,完成后再转换为string。无论哪种转换,都会重新分配内存,并复制字节数组

func changeString() {
    s1 := "big"
    // 强制类型转换
    byteS1 := []byte(s1)
    byteS1[0] = 'p'
    fmt.Println(string(byteS1))

    s2 := "白萝卜"
    runeS2 := []rune(s2)
    runeS2[0] = '红'
    fmt.Println(string(runeS2))
}


字符转换

字节集合转换成字符串

byteList := []byte{232 165 191 231 142 175 229 141 129 228 184 137 233 131 142}
targetString := string(byteList)
fmt.Println(targetString)

// 输出的结果为:西环十三郎

字符串转换成字节集合

var name = "西环十三郎"
byteList := []byte(name)
fmt.Println(byteList)

// 输出的结果为:[232 165 191 231 142 175 229 141 129 228 184 137 233 131 142]

rune转换成字符串

runeSet := []rune{35199, 29615, 21313, 19977, 37070}
fmt.Println(string(runeSet))

// 输出的结果为:西环十三郎

字符串转换成rune

runeSet := []rune(name)
fmt.Println(runeSet)

// 输出的结果为:[232 165 191 231 142 175 229 141 129 228 184 137 233 131 142]


  • 标签云

  • 支付宝扫码支持一下

  • 微信扫码支持一下



基于Nginx+Supervisord+uWSGI+Django1.11.1+Python3.6.5构建

版权所有 © 2020-2021 August Rush

京ICP备20007446号-1 & 豫公网安备 41100202000460号

网站地图 & RSS | Feed