美文网首页
3.2.3.2Golang的数据类型--字符串

3.2.3.2Golang的数据类型--字符串

作者: 寒暄_HX | 来源:发表于2020-03-15 19:05 被阅读0次

    总目录:https://www.jianshu.com/p/e406a9bc93a9

    Golang - 子目录:https://www.jianshu.com/p/8b3e5b2b4497

    字符串

    Go语言中的字符串以原生数据类型出现。
    Go 语言里的字符串的内部实现使用UTF-8编码。
    字符串的值为双引号(")中的内容。
    可以在Go语言的源码中直接添加非ASCII码字符。
    例如:

    s1 := "hello world"
    s2 := "你好"
    

    转义字符

    转义符 含义
    \r 回车符(返回行首)
    \n 换行符(直接跳到下一行的同列位置)
    \t 制表符
    ' 单引号
    " 双引号
    \ 反斜杠
    package main
    
    import "fmt"
    
    func main()  {
        // 转义字符
        s1 := "hello \nworld"
        fmt.Println(s1)
        s2 := "他说:\""
        fmt.Println(s2)
        s3 := "c:\\windows\\system32"
        fmt.Println(s3)
    }
    ----------
    hello
    world
    他说:"
    c:\windows\system32
    

    多行字符串

    Go语言中要定义一个多行字符串时,就必须使用反引号字符。
    反引号间换行将被作为字符串中的换行,但是所有的转义字符均无效,文本将会原样输出。

        s4 := `
            世情薄
            人情恶
            雨送黄昏花易落
        `
        fmt.Println(s4)
    ----------
            世情薄
            人情恶
            雨送黄昏花易落
    

    常用操作

    方法 介绍
    len(str) 求长度
    +或fmt.Sprintf 拼接字符串
    strings.Split 分割
    strings.contains 判断是否包含
    strings.HasPrefix,strings.HasSuffix 前缀/后缀判断
    strings.Index(),strings.LastIndex() 子串出现的位置
    strings.Join(a[]string, sep string) join操作
    package main
    
    import (
        "fmt"
        "strings"   // 字符串库,必须要导入  字符串操作很多都依赖这个库
    )
    
    func main() {
        // 字符串操作
        // len
        s4 := `
            世情薄
            人情恶
            雨送黄昏花易落
        `
        fmt.Println("字符串长度为:", len(s4))
    
        // 字符串拼接
        s5 := "法外狂徒"
        s6 := "张三"
        fmt.Println("字符串拼接:", s5+s6)
        s7 := fmt.Sprintf("%s%s", s5, s6)
        fmt.Println(s7)
    
        // 字符串分割
        s8 := "1,2,3,4,5,6"
        ret := strings.Split(s8, ",")
        fmt.Println("字符串分割", ret)
    
        // 是否包含
        fmt.Println("字符串s8是否包含1:", strings.Contains(s8, "1"))
        fmt.Println("字符串s8是否包含7:", strings.Contains(s8, "7"))
    
        // 前缀判断
        s9 := "hello world"
        fmt.Println("字符串s9是否以he开头:", strings.HasPrefix(s9, "he"))
        // 后缀判断
        fmt.Println("字符串s9是否以ld结尾:", strings.HasSuffix(s9, "ld"))
        // 查找子串
        fmt.Println("字符串l在字符串s9最先出现在哪里:", strings.Index(s9, "l"))
        fmt.Println("字符串l在字符串s9最后出现在哪里:", strings.LastIndex(s9, "l"))
        // join操作
        fmt.Println("将ret中的元素用+号连接在一起:", strings.Join(ret,"+"))
    }
    ----------
    字符串长度为: 50
    字符串拼接: 法外狂徒张三
    法外狂徒张三
    字符串分割 [1 2 3 4 5 6]
    字符串s8是否包含1: true
    字符串s8是否包含7: false
    字符串s9是否以he开头: true
    字符串s9是否以ld结尾: true
    字符串l在字符串s9最先出现在哪里: 2
    字符串l在字符串s9最后出现在哪里: 9
    将ret用+号连接在一起: 1+2+3+4+5+6
    

    byte和rune

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

    c1 := 'a'
    c2 := 'b'
    

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

    1. uint8类型,或者叫 byte 型,代表了ASCII码的一个字符。
    2. rune类型,代表一个 UTF-8字符,用来处理中文、日文或者其他复合字符。

    rune类型实际是一个int32

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

        s := "hello沙河"
        //byte
        for i := 0; i < len(s); i++ { 
            fmt.Printf("%v(%c) ", s[i], s[i])
        }
        fmt.Println()
        //rune    
        for _, r := range s {
            fmt.Printf("%v(%c) ", r, r)
        }
        fmt.Println()
    ------------
    104(h) 101(e) 108(l) 108(l) 111(o) 230(æ) 178(²) 153() 230(æ) 178(²) 179(³)
    104(h) 101(e) 108(l) 108(l) 111(o) 27801(沙) 27827(河)
    

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

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

    修改字符串

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

        // 修改字符串
        ss1 := "big"
        // 强制类型转换
        byteS1 := []byte(ss1)
        byteS1[0] = 'p'
        fmt.Println(string(byteS1))
    
        ss2 := "白萝卜"
        runeS2 := []rune(ss2)
        runeS2[0] = '红'
        fmt.Println(string(runeS2))
    --------
    pig
    红萝卜
    

    类型转换

    go的类型转换很粗暴,没有隐式转换,都是使用工厂函数强转。

        // 类型转换
        a := 10 //int
        var b float64
        b = float64(a)
        fmt.Printf("%T",b) //float64
    ----------
    float64
    

    练习题

    编写代码统计出字符串"hello沙河小王子"中汉字的数量。

    package main
    import (
        "fmt"
        "unicode"
    )
    func main()  {
        count := 0
        s := "hello, 沙河小王子"
        for _, r := range s{
            if unicode.Is(unicode.Han, r) {
                count++
            }
        }
        fmt.Println("汉字个数:",count)
    }
    

    相关文章

      网友评论

          本文标题:3.2.3.2Golang的数据类型--字符串

          本文链接:https://www.haomeiwen.com/subject/adjdehtx.html