3.Golang字符串string类型

目录

1.基本概念

2.string常用方法

        (1).len()

        (2).追加 +=

        (3).string取值 [ ]

        (4).string拼接(5种)

        (5).string分割 Split

        (6).string与整数之间转换

3.string重要方法

        (1).字符串比较(两种)

        (2).去除 TrimSpace

        (3).索引位置 Index

        (4).统计子字符串个数 Count

4.string基本方法

        (1).判断包含 Contains

        (2).判断前后缀

        (3).替换 Replace

        (4).连续复制 Repeat

5.golang转义子符

6.字符串赋值(拷贝),地址变化情况


1.基本概念

1.golang的字符类型(byte和rune)
    (1).byte类型:也称uint8类型(0 ~ 255),每个数代表了ASCII码的一个字符。
    (2).rune类型:代表一个 UTF-8 字符,英文字母1个字节,汉字3个字节

2.关键字string,使用方式:用双引号"",或反引号``

3.string是不可变,不能通过索引下标的方式修改字符串中的数据

4.go语言中的字符串是以原生数据类型出现,字符串的内部实现的编码是UTF-8,英文字母1个字节,汉字3个字节,生僻字4-6个字节

2.string常用方法

        (1).len()

        (2).追加 +=

        (3).string取值 [ ]

        (4).string拼接(5种)

        (5).string分割 Split

        (6).string与整数之间转换

1.长度len():
    特别注意:len():是求字节长度,在golang中,一个中文字符占三个字节长度
    package main
    import "fmt"
    func main() {
        mag := "我们在学golang"
        fmt.Printf("mag长度: %v\n", len(mag))       // mag字节长度: 18

        fmt.Println(utf8.RuneCountInString(mag))    // 补充打印mag字符串长度(中文也算1长度)
    }


2.字符串追加(数字类型追加也可用):+=


3.string[]取值:
  分类:str[n], str[:], str[:n], str[n:], str[n:m]    其中n与m是字节位置,从0开始。[]取值是取头不取尾
    (1).str[n]取值:返回的是第n字节位置上字符对应的Unicode码值(uint8类型)
        package main
        import "fmt"
        func main() {
            mag := "我们在学golang"
            fmt.Printf("mag[0]: %v\n", mag[0])        // mag[0]: 230   (注意取第一个中文不可用mag[0:2],会乱码)
            fmt.Printf("mag[12]: %v\n", mag[12])      // mag[12]: 103  (默认打印Unicode(utf-8)码值)
            fmt.Printf("mag[12]转译: %c\n", mag[12])  // mag[12]转译: g (用%c转义)
        }
    (2).str[:]取值:将str从头到尾克隆
    (3).str[:n]取值:将str取0到n-1的值
    (4).str[n:]取值:将str从n开始取值到最后
    (5).str[n:m]取值:将str从n开始取值到m-1位
    (6).取字符串中的中文字符:
        原因:中文一个字不只是由一个字节组成,
             直接通过切片获取时可能会把一个中文字的编码截成两半,结果导致最后一个字符是乱码。
        解决办法:先将字符串转为[]rune类型,再截取后,转回字符串类型。
        package main
        import "fmt"
        func main() {
            mag := "我们在学golang"
            nameRune := []rune(mag)
            fmt.Println("第一个字符:", string(nameRune[0]))    // 第一个字符:我
        }


4.字符串拼接:
    (1).加号+
        a, b := "abc", "def"
        mag := a + b
        fmt.Printf("mag: %v\n", mag)                          // mag: abcdef
    (2).字符串后面追加+=
        a += b
    (2).格式拼接
        a, b := "abc", "def"
        mag := fmt.Sprintf("%s%s", a, b)
        fmt.Printf("mag: %v\n", mag)                         // mag: abcdef

    (3).字符串型数组 strings.Join(mag []string, sep string)
        mag := []string{"my", "name", "fly"}
        fmt.Println(strings.Join(mag, "-"))                 // my-name-fly
        // 补充:这面向的是全是字符串的数组(将数组内的字符串按格式拼接成字符串)

    (4).字节缓存区 buffer.WriteString()
        var buffer bytes.Buffer
        buffer.WriteString("my")
        buffer.WriteString("name")
        buffer.WriteString("isfly")
        fmt.Println(buffer.String()                    // mynameisfly


5.分割 Split (返回一个字符串数组)
    (1)strings.Split(mag,sep string): 以sep方式对字符串mag进行 去除式 分割,返回一个字符串数组
        mag := "我:叫:fly"
        fmt.Println(strings.Split(mag, ":"))          // [我 叫 fly]  类型:[]string

    (2).strings.Title(mag):
        描述:将字符串mag出现的连续空白字符转为一个空白字符(按照空白字符进行去除式分割),
             返回一个字符串数组(返回str空格分隔的所有子串的slice)
        mag := "dvf sg       fdg"
        fmt.Println(strings.Fields(mag))             // [dvf sg fdg]

    (3).strings.SplitN(mag, sep string, n int):
        描述:按照返回子字符串个数,对字符串mag以以sep方式进行 去除式 分割,返回一个字符串数组
        mag := "dfsrdsfgdfdsffdvf"
        fmt.Println(strings.SplitN(mag, "d", -2))    // [ fsr sfg f sff vf]  n<0 全切
        fmt.Println(strings.SplitN(mag, "d", -1))    // [ fsr sfg f sff vf]
        fmt.Println(strings.SplitN(mag, "d", 0))    // []                   n=0 返回[]
        fmt.Println(strings.SplitN(mag, "d", 1))    // [dfsrdsfgdfdsffdvf]  n>0 返回n个子字符串(切除n-1个sep字符)
        fmt.Println(strings.SplitN(mag, "d", 2))    // [ fsrdsfgdfdsffdvf]
        fmt.Println(strings.SplitN(mag, "d", 3))    // [ fsr sfgdfdsffdvf]
        fmt.Println(strings.SplitN(mag, "d", 4))    // [ fsr sfg fdsffdvf]
        fmt.Println(strings.SplitN(mag, "d", 5))    // [ fsr sfg f sffdvf]
        fmt.Println(strings.SplitN(mag, "d", 6))    // [ fsr sfg f sff vf]
        fmt.Println(strings.SplitN(mag, "d", 7))    // [ fsr sfg f sff vf]      n大于Count(sep)+1,全切

    (4).strings.SplitAfter(mag, sep string):
        描述:以sep字符后面开始,对字符串mag进行 非去除式 分割,返回一个字符串数组
        mag := "vvdfsrdsfgdfdsffdvf"
        fmt.Println(strings.SplitAfter(mag, "d"))       // [vvd fsrd sfgd fd sffd vf]

    (5).strings.SplitAfterN(mag, sep string, n int):
        描述:按照返回子字符串个数,以sep字符后面开始,对字符串mag进行 非去除式 分割,返回一个字符串数组


6.string与整数之间转换
    (1).整数i转成字符串 strconv.Itoa(i int)
        mag := 12
        fmt.Println(strconv.Itoa(mag), reflect.TypeOf(strconv.Itoa(mag)))   // 12 string
        //补充:打印类型可以用模块“reflect”, reflect.TypeOf()

    (2).字符串转整数 strconv.Atoi(mag string)   返回(int, error)
        mag := "12"
        n, err := strconv.Atoi("123")
        if err!=nil {
            panic(err)
        }
        fmt.println(n, reflect.TypeOf(n))                      // 12  int

3.string重要方法

        (1).字符串比较(两种)

        (2).去除 TrimSpace

        (3).索引位置 Index

        (4).统计子字符串个数 Count

1.字符串比较(两种):
    (1).strings.Compare(a, b string)            // 如果a==b返回0;如果a<b返回-1;否则返回+1
        a := "12"
        b := "10"
        fmt.Println(strings.Compare(a, a))      // 1

    (2).strings.EqualFold(a, b string)          // 返回bool类型
        a := "12"
        b := "10"
        fmt.Println(strings.EqualFold(a, b))    // false


2.去除 TrimSpace :
    (1).strings.TrimSpace(mag)    去除字符串mag首尾的空白字符 
        mag := "  dfadfdv sdf asf   afgd   "
        fmt.Println(strings.TrimSpace(mag))          // dfadfdv sdf asf   afgd
    
    (2).strings.Trim(mag, sep string)    去除字符串mag首尾的sep字符 
        mag := "gggdfadfdv sdf asf   afgggd g  gg"
        fmt.Println(strings.Trim(mag, "g"))         // dfadfdv sdf asf   afgggd g
    
    (3).strings.TrimLeft(mag, sep string)    去除字符串mag左边的sep字符 
        mag := "gggdfadfdv sdf asf   afgggd g  gg"
        fmt.Println(strings.TrimLeft(mag, "g"))     // dfadfdv sdf asf   afgggd g  gg
    
    (4).strings.TrimRight(mag, sep string)    去除字符串mag左边的sep字符 
        mag := "gggdfadfdv sdf asf   afgggd g  gg"
        fmt.Println(strings.TrimRight(mag, "g"))    // gggdfadfdv sdf asf   afgggd g


3.索引位置 Index :
    mag := "我们在学golang"
    fmt.Println(strings.Index(mag, "们"))      // 3   该参数首次出现的位置,如果是中文默认返回该中文的第一个字节索引
    fmt.Println(strings.LastIndex(mag, "在"))  // 18  该参数最后出现的位置
    fmt.Println(strings.LastIndex(mag, "j"))   // -1  查询不到返回-1


4.统计子字符串个数 Count
    mag := "我们在学golang"
    fmt.Println(strings.Count(mag, "g"))      // 2

4.string基本方法

        (1).判断包含 Contains

        (2).判断前后缀

        (3).替换 Replace

        (4).连续复制 Repeat

1.判断包含 Contains :
    mag := "我们在学golang"
    fmt.Println(strings.Contains(mag, "我"))    // true     判断字符串mag是否包含子字符串"我"
    fmt.Println(strings.ContainsRune(mag, 103)) // true     判断字符串mag是否包含utf-8码值103(103是g)
    fmt.Println(strings.ContainsAny(mag, mag))	// true     判断字符串mag是否包含字符串mag中的任一字符


2.判断前后缀
    (1).判断前缀 strings.HasPrefix()
        mag := "我:是:fly"
	    fmt.Println(strings.HasPrefix(mag, "我:"))      // true

    (2).判断后缀 strings.HasSuffix
        mag := "你:好:呀"
        fmt.Println(strings.HasSuffix(mag, "啊"))       // flase


3.替换 Replace
    mag := "我们在学golang"
    fmt.Println(strings.Replace(mag, "g", "n", 2))  // 我们在学nolann   
                                           // 参数 "g":被替换字符串(old),"n":新字符串(new),2:前面2个“g”(个数)


4.连续复制 Repeat
    mag := "我们在学golang"
    fmt.Println(strings.Repeat(mag, 3))   // 我们在学golang我们在学golang我们在学golang    复制3次

5.golang转义子符

1. \r 回车(回到首行)
2. \n 换行符(直加跳到下一行的同列位置)
3. \t 制表符(占位)
4. \' 单引号
5. \" 双引号
6. \\ 反斜杆

6.字符串赋值(拷贝),地址变化情况

1.golang的字符串赋值,并不是直接拷贝底层的值(不是拷贝底层字符串数组)
    而是拷贝了一个指针和长度字段指向该值
    a := "abc"
    a = "def"
    b := a
    c := "ghi"
    a = b + c
    fmt.Printf("ft: %v\n", a)   // defghi
    fmt.Printf("sd: %v\n", b)   // def
    fmt.Printf("gh: %v\n", c)   // ghi

2.对已有值得字符串重新赋值,原内存空间不变,
    申请新的内存空间进行赋值指针指向新值地址
  • 2
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值