关于go:Go语言学习笔记06字符与字符串

39次阅读

共计 3127 个字符,预计需要花费 8 分钟才能阅读完成。

Go 语言学习笔记 -06 字符与字符串

字符

Go 中的字符是一个 Unicode 字符,应用 UTF- 8 编码格局,一个字符由一个或多个字节存储在内存中,字符的默认类型为int32

应用 rune 类型示意一个 Unicode 码点,一个码点对应一个字符。rune类型实质是 int32 类型

// $GOROOT/src/builtin.go
type rune = int32

应用 byte 类型示意一个字节以内的字符,byte类型实质是 int8 类型

// $GOROOT/src/builtin.go
type byte = uint8

字面值

应用'',’a’,’ 闲 ’

应用\x,接十六进制数,最多示意FF,’\x61’,

应用\,接八进制数,最多示意377,’\141′

应用 \u 前缀接四个十六进制数,’\u95f2′

应用 \U 前缀接四个或八个十六进制数,’\u000095f2’,’\U000095f2′

ch06/main.go

package main

import "fmt"

func main() {
    // 实质上是 int32 类型
    var ch1 rune
    ch1 = '闲'

    // 应用 %c 格式化输入字符
    fmt.Printf("闲的 Unicode 码点值:%d, 字符:%c\n", ch1, ch1)

    ch2 := '渔'
    fmt.Printf("渔的 Unicode 码点值:%d, 字符:%c\n", ch2, ch2)

    // 应用八进制数示意字符 a
    ch3 := '\141'
    // 应用十六进制数示意字符 a
    ch4 := '\x61'

    fmt.Printf("八进制 141 示意的字符为:%c\n", ch3)
    fmt.Printf("十六进制 61 示意的字符为:%c\n", ch4)

    // 应用 \u 接四个十六进制数示意
    ch5 := '\u95f2'
    fmt.Printf("\\u95f2 示意的字符为:%c\n", ch5)

    // 应用 \U 接四个或八个十六进制数示意
    ch6 := '\U000095f2'
    fmt.Printf("\\u95f2 示意的字符为:%c\n", ch6)

    // 应用 byte 示意单字节字符
    var ch7 byte
    ch7 = 97
    fmt.Printf("97 对应的 ascii 为 %c\n", ch7)

    // 应用 rune 示意一个 Unicode 码点
    var ch8 rune
    ch8 = 38386
    fmt.Printf("38386 对应的 Unicode 字符为 %c", ch8)
}

输入

闲的 Unicode 码点值:38386, 字符:闲
渔的 Unicode 码点值:28180, 字符:渔
八进制 141 示意的字符为:a          
十六进制 61 示意的字符为:a         
\u95f2 示意的字符为:闲           
\u95f2 示意的字符为:闲           
97 对应的 ascii 为 a                 
38386 对应的 Unicode 字符为闲  

字符串

字符串是由多个字符组成,也就是由字节序列组成

字面值

应用"",” 闲渔一下 ”

其余模式与字符统一

ch06/string/main.go

package main

import "fmt"

func main() {
    s1 := "闲渔一下"
    // 应用 \u 前缀接四个十六进制数
    s2 := "\u95f2\u6e14\u4e00\u4e0b"
    // 应用 \U 前缀接八个十六进制数
    s3 := "\U000095f2\U00006e14\U00004e00\U00004e0b"
    // 应用十六进制,utf- 8 编码
    s4 := "\xe9\x97\xb2\xe6\xb8\x94\xe4\xb8\x80\xe4\xb8\x8b"
    // 混合应用
    s5 := "闲 \u6e14\U00004e00\xe4\xb8\x8b"
    fmt.Println(s1)
    fmt.Println(s2)
    fmt.Println(s3)
    fmt.Println(s4)
    fmt.Println(s5)
}

输入

闲渔一下
闲渔一下
闲渔一下
闲渔一下
闲渔一下

原始字符串

应用反引号,外面字符都不会本义,所见即所得

package main

import "fmt"

func main() {
    s1 := ` 今人学识无遗力,少壮时间老始成。纸上得来终觉浅,绝知此事要躬行。`
    fmt.Println(s1)
}

输入

今人学识无遗力,少壮时间老始成。纸上得来终觉浅,绝知此事要躬行。

读取字符串

应用 [] 和下标去获取字符串对应的字节

ch06/getchar/main.go

package main

import "fmt"

func main() {
    s1 := "闲渔一下"

    // 应用下标获取
    fmt.Printf("s1 的第一个字节为:%x\n", s1[0])
    // 取前 3 个字节组成的字符串,因为是 utf- 8 编码,1 个中文用 3 个字节示意,所以为闲
    fmt.Printf("s1 的第一个字符为:%s\n", s1[0:3])
}

输入

s1 的第一个字节为:e9
s1 的第一个字符为:闲

字符串不可变性

无奈通过下标操作批改字符串某个字节的数据

package main

func main() {
    s1 := "闲渔一下"

    s1[0] = 'a'  // 报错
}

获取长度

应用内置函数 len 获取字符串长度,等于组成字符串的字节序列的字节个数

ch06/stringlength/main.go

package main

import (
    "fmt"
    "unicode/utf8"
)

func main() {
    // utf- 8 编码,一个中文由 3 个字节组成,所以长度为 12
    s1 := "闲渔一下"

    fmt.Printf("s1 的长度为:%d\n", len(s1))
    fmt.Printf("s1 的字符个数为:%d\n", utf8.RuneCountInString(s1))
}

输入

s1 的长度为:12
s1 的字符个数为:4

字符串拼接

应用 + 拼接字符串

ch06/joinstring/main.go

package main

import "fmt"

func main() {
    s1 := "闲渔"
    s2 := "一下"
    s3 := s1 + s2
    fmt.Println(s3)
}

遍历字符串

第一种形式,应用 for 遍历,每次遍历进去的值是组成字符串的每个字节

第二种形式,应用 for range 遍历,每次遍历进去的是 Unicode 字符的码点值及该字符在字符串中的偏移量

ch06/iterstring/main.go

package main

import "fmt"

func main() {
    s1 := "闲渔一下"

    fmt.Println("形式一")
    // 形式一,遍历进去的是 utf8 编码的字节
    for i := 0; i < len(s1); i++ {fmt.Printf("0x%x", s1[i])
    }

    fmt.Println()

    // 以字符格局输入为乱码
    for i := 0; i < len(s1); i++ {fmt.Printf("%c", s1[i])
    }

    fmt.Println("\n 形式二")

    // 形式二,遍历进去的是 Unicode 字符的码点值
    for i, ch := range s1 {fmt.Printf("偏移量 %d 对应的字符为 %c\n", i, ch)
    }

    fmt.Println()

    // 打印每个字符的码点值, 十六进制示意
    for _, ch := range s1 {fmt.Printf("%c:%x", ch, ch)
    }

    fmt.Println()

    // 打印每个字符的码点值, 十进制示意
    for _, ch := range s1 {fmt.Printf("%c:%d", ch, ch)
    }
}

输入

形式一
0xe9 0x97 0xb2 0xe6 0xb8 0x94 0xe4 0xb8 0x80 0xe4 0xb8 0x8b 
é 
形式二                                                      
偏移量 0 对应的字符为闲                                       
偏移量 3 对应的字符为渔                                       
偏移量 6 对应的字符为一                                       
偏移量 9 对应的字符为下                                       
                                                            
闲:95f2 渔:6e14 一:4e00 下:4e0b                             
闲:38386 渔:28180 一:19968 下:19979  

笔记地址

github:https://github.com/xianyuyixi…

交流学习

微信号:xianyuyixia

微信公众号:闲渔一下

正文完
 0