Golang语言基础数据类型之字符串常用的操作

简介: 这篇文章介绍了Golang语言中字符串的定义、常用操作,包括字符串长度查看、遍历、类型转换、子串统计、比较、查找位置、替换、切割、大小写转换、剔除字符、前缀后缀判断、拼接、子串包含判断以及字符串join操作,同时提供了官方文档的查看方法。

                                              作者:尹正杰
版权声明:原创作品,谢绝转载!否则将追究法律责任。

一.字符串定义

1.字符串概述

字符串就是一串固定长度的字符链接起来的字符序列,字符和字符串的关系有点类似于糖葫芦,羊肉串,豌豆荚之类的关系。

Go语言中的字符串以原生数据类型出现,使用字符串就像使用其他原生数据类型(int、bool、float32、float64等)一样。 

Go语言里的字符串的内部实现使用UTF-8编码,该字符集包含包含ASCII码。 字符串的值为双引号(")中的内容。

2.多行字符串

package main

import (
    "fmt"
)

func main() {

    var (
        // 1.单行模式(Single row mode),使用双引号("")括起来即可
        s1 string = "\n\tGOPATH路径:\n\t\t 'd:\\yinzhengjie\\code\\Golang\\go.exe'\n\t\t\t\v开始学习Golang吧!\v要加油哟!\v你可以的!"

        // 2.多行字符串模式(Multiline mode),使用反引号(``)包起来即可,这是Go语言特有的写法。
        // 反引号间换行将被作为字符串中的换行,但是所有的转义字符均无效,文本将会原样输出。
        s2 string = `
        欢迎访问博客地址:
            "https://www.cnblogs.com/yinzhengjie/"
        \n\t\t\t\v开始学习Golang吧!
        `

        s3 = "yinzhengjie"
    )

    fmt.Printf("s1 ---> %s\n", s1)
    fmt.Printf("s2 ---> %s\n", s2)

    // 3.字符串不支持修改,会报错: cannot assign to s3[0] (neither addressable nor a map index expression)
    // s3[0] = 'Y'
    fmt.Println(s3[0])
}

3.修改字符串

package main

import (
    "fmt"
)

func main() {
    s1 := "白萝卜"

    // 想要修改字符串,则需要将字符串转换为切片类型进行修改。
    s2 := []rune(s1)
    fmt.Println("修改前 --->: ", string(s2))
    s2[0] = '红'
    fmt.Println("修改后 --->: ", string(s2))

    // 实际上,s1这个变量压根就没有动过
    fmt.Println("s1 = ", s1)
}

二 字符串常用的操作

1 查看字符串的长度

package main

import (
    "fmt"
)

func main() {

    // 统计字符串的长度默认是按照字节进行统计,而golang中,汉字是utf-8字符集,一个汉字对应3个字节。
    s1 := "尹正杰Golang"

    // len为内置函数,无需导包,直接使用即可
    fmt.Printf("s1的字符串长度为: %d\n", len(s1))
}

2 遍历字符串

package main

import (
    "fmt"
)

func main() {

    s1 := "尹正杰2020"

    // 遍历字符串方式一: 利用for-range循环
    for index, value := range s1 {
        fmt.Printf("索引为: %d, 数据为: %c\n", index, value)
    }

    fmt.Println("---------- 分割线 ----------")

    // 遍历字符串方式二: 字节切片"[]rune(string)"
    data := []rune(s1)

    for index := 0; index < len(data); index++ {
        fmt.Printf("索引为: %d, 数据为: %c\n", index, data[index])
    }

}

3 字符串和整数相互转换

package main

import (
    "fmt"
    "strconv"
)

func main() {

    var (
        a string = "2030"
        b int    = 2020
    )

    // 将字符串转换为一个整数
    x, _ := strconv.Atoi(a)

    fmt.Printf("x的类型是: %T, x的值为: %d\n", x, x)

    // 整数转换为字符串

    y := strconv.Itoa(b)

    fmt.Printf("y的类型是: %T, y的值为: %s\n", y, y)

}

4 统计一个字符串有几个指定的子串

package main

import (
    "fmt"
    "strings"
)

func main() {

    source := "Google FaceBook"
    subStr := "oo"

    // 统计一个字符串有几个指定的子串
    count := strings.Count(source, subStr)

    fmt.Printf("[%s]中出现[%s]的次数是: %d\n", source, subStr, count)
}

5 字符串比较

package main

import (
    "fmt"
    "strings"
)

func main() {

    password := "HELLO"

    input := "hello"

    // 忽略大小写的字符串比较
    flag := strings.EqualFold(password, input)

    // 区分大小写比较
    flag2 := password == input

    fmt.Printf("忽略大小写比较: %s = %s ---> [%t]\n", password, input, flag)

    fmt.Printf("区分大小写比较: %s == %s ---> [%t]\n", password, input, flag2)

}

6 求子串出现的位置

package main

import (
    "fmt"
    "strings"
)

func main() {
    src := "JasonYin2020 no problem !!!"

    findstr := "o"

    // 求子串第一次出现的位置,如果没有返回-1
    first := strings.Index(src, findstr)

    // 求子串最后次出现的位置,如果没有返回-1
    last := strings.LastIndex(src, findstr)

    fmt.Printf("[%s]字符串的[%s]第一次出现的位置是: %d\n", src, findstr, first)
    fmt.Printf("[%s]字符串的[%s]最后一次出现的位置是: %d\n", src, findstr, last)
}

7 字符串的替换

package main

import (
    "fmt"
    "strings"
)

func main() {
    source := "go ! go ! fire the hole ~ go ! go ! fire the hole ~"

    src := "go"

    dest := "golang"

    // 字符串的替换,"-1"表示全部替换。
    s1 := strings.Replace(source, src, dest, -1)

    // 字符串的替换,"2"表示只替换2次,如果想要指定替换次数修改成相应的数字即可。
    s2 := strings.Replace(source, src, dest, 2)

    fmt.Printf("s1 = %s\n", s1)
    fmt.Printf("s2 = %s\n", s2)

}

8 切割字符串

 package main

import (
    "fmt"
    "strings"
)

func main() {

    s1 := "DAU|5200|添加购物车|1|3270221.99"

    // 将s1字符串按照字符"b"进行切割,将字符串拆分成字符串切片
    s2 := strings.Split(s1, "|")

    fmt.Printf("s2 = %v\n",s2)

    fmt.Printf("userId = %v, svip= %v\n",s2[1],s2[3])
}

9 字母大小写转换

package main

import (
    "fmt"
    "strings"
)

func main() {

    src := "Golang"

    lower := strings.ToLower(src)

    upper := strings.ToUpper(src)

    fmt.Printf("%s转换为小写后: %s\n", src, lower)
    fmt.Printf("%s转换为大写后: %s\n", src, upper)

}

10 剔除字符

package main

import (
    "fmt"
    "strings"
)

func main() {

    s1 := "   Golang xixi     "
    // 将字符串左右两边的空格去掉
    s2 := strings.TrimSpace(s1)

    fmt.Printf("s1 = [%s],s2 = [%s]\n", s1, s2)

    s3 := "@@@golang@@@"
    // 将字符左边指定的字符去掉
    s4 := strings.TrimLeft(s3,"@")
    // 将字符右边指定的字符去掉
    s5 := strings.TrimRight(s3,"@")

    fmt.Printf("s3 = [%s],s4 = [%s],s5 = [%s]\n", s3,s4,s5)

}

11 判断前缀和后缀

package main

import (
    "fmt"
    "strings"
)

func main() {
    s1 := "https://www.cnblogs.com/yinzhengjie"

    prefix := "https"

    // 判断字符串是否以'https'开头
    result01 := strings.HasPrefix(s1, prefix)

    suffix := "yinzhengjie"
    // 判断字符串是否以'yinzhengjie'结尾
    result02 := strings.HasSuffix(s1, suffix)

    fmt.Printf("[%s]以[%s]开头,---> [%t]\n", s1, prefix, result01)
    fmt.Printf("[%s]以[%s]结尾,---> [%t]\n", s1, suffix, result02)
}

12 拼接字符串

package main

import (
    "fmt"
)

func main() {
    s1 := "Jason Yin"
    s2 := "https://www.cnblogs.com/yinzhengjie/"

    // 方式一: 直接使用"+"进行拼接字符串
    s3 := s1 + "的博客地址:" + s2
    fmt.Printf("s3 ---> %s\n", s3)

    // 方式二: 使用"fmt"包的"Sprintf"方法也可以用于拼接字符串哟~
    s4 := fmt.Sprintf("%s的博客地址:%s", s1, s2)
    fmt.Printf("s4 ---> %s\n", s4)
}

13 判断是否包含子串

package main

import (
    "fmt"
    "strings"
)

func main() {
    s1 := "JasonYin2020"

    subStr := "Yin"
    // 判断s1字符串是否包含字符串"Yin",区分大小写哟~
    result := strings.Contains(s1, subStr)

    fmt.Printf("[%s]包含[%s] ---> %t\n", s1, subStr, result)
}

14 字符串join操作

package main

import (
    "fmt"
    "strings"
)

func main() {

    // 定义一个切片
    s1 := []string{"C++", "Java", "Golang", "Python", "JavaScript", "CSS"}

    // 将一个切片拼接为一个字符串
    s2 := strings.Join(s1, "######")

    fmt.Printf("s2的类型是: %T, s2的数据为: %s\n", s2, s2)
}

15 查看官方文档

方法一: 基于命令行的方式查看:
    go doc strings.Split  // 表示查看"strings"包的"Split"方法的文档。

    详细命令请参考: (go help doc)
        go doc [doc flags] [package|[package.]symbol[.methodOrField]]


方法二: 基于官方文档查看:
    https://studygolang.com/pkgdoc
    https://pkg.go.dev/std

方法三: 基于本地文档查看(早期版本是默认会安装一个godoc命令,新版本安装貌似没找到哟~可能是集成到go)
    godoc -http:=9000

  推荐阅读:
    https://developer.aliyun.com/article/1604746
目录
相关文章
|
3月前
|
Go
Golang语言之管道channel快速入门篇
这篇文章是关于Go语言中管道(channel)的快速入门教程,涵盖了管道的基本使用、有缓冲和无缓冲管道的区别、管道的关闭、遍历、协程和管道的协同工作、单向通道的使用以及select多路复用的详细案例和解释。
142 4
Golang语言之管道channel快速入门篇
|
3月前
|
Go
Golang语言文件操作快速入门篇
这篇文章是关于Go语言文件操作快速入门的教程,涵盖了文件的读取、写入、复制操作以及使用标准库中的ioutil、bufio、os等包进行文件操作的详细案例。
72 4
Golang语言文件操作快速入门篇
|
3月前
|
Go
Golang语言之gRPC程序设计示例
这篇文章是关于Golang语言使用gRPC进行程序设计的详细教程,涵盖了RPC协议的介绍、gRPC环境的搭建、Protocol Buffers的使用、gRPC服务的编写和通信示例。
117 3
Golang语言之gRPC程序设计示例
|
3月前
|
安全 Go
Golang语言goroutine协程并发安全及锁机制
这篇文章是关于Go语言中多协程操作同一数据问题、互斥锁Mutex和读写互斥锁RWMutex的详细介绍及使用案例,涵盖了如何使用这些同步原语来解决并发访问共享资源时的数据安全问题。
101 4
|
3月前
|
Go 调度
Golang语言goroutine协程篇
这篇文章是关于Go语言goroutine协程的详细教程,涵盖了并发编程的常见术语、goroutine的创建和调度、使用sync.WaitGroup控制协程退出以及如何通过GOMAXPROCS设置程序并发时占用的CPU逻辑核心数。
74 4
Golang语言goroutine协程篇
|
3月前
|
Prometheus Cloud Native Go
Golang语言之Prometheus的日志模块使用案例
这篇文章是关于如何在Golang语言项目中使用Prometheus的日志模块的案例,包括源代码编写、编译和测试步骤。
80 3
Golang语言之Prometheus的日志模块使用案例
|
2月前
|
前端开发 中间件 Go
实践Golang语言N层应用架构
【10月更文挑战第2天】本文介绍了如何在Go语言中使用Gin框架实现N层体系结构,借鉴了J2EE平台的多层分布式应用程序模型。文章首先概述了N层体系结构的基本概念,接着详细列出了Go语言中对应的构件名称,包括前端框架(如Vue.js、React)、Gin的处理函数和中间件、依赖注入和配置管理、会话管理和ORM库(如gorm或ent)。最后,提供了具体的代码示例,展示了如何实现HTTP请求处理、会话管理和数据库操作。
38 0
|
3月前
|
Go
Golang语言错误处理机制
这篇文章是关于Golang语言错误处理机制的教程,介绍了使用defer结合recover捕获错误、基于errors.New自定义错误以及使用panic抛出自定义错误的方法。
55 3
|
3月前
|
Go
Golang语言之函数(func)进阶篇
这篇文章是关于Golang语言中函数高级用法的教程,涵盖了初始化函数、匿名函数、闭包函数、高阶函数、defer关键字以及系统函数的使用和案例。
73 3
Golang语言之函数(func)进阶篇
|
3月前
|
Go
Golang语言之函数(func)基础篇
这篇文章深入讲解了Golang语言中函数的定义和使用,包括函数的引入原因、使用细节、定义语法,并通过多个案例展示了如何定义不返回任何参数、返回一个或多个参数、返回值命名、可变参数的函数,同时探讨了函数默认值传递、指针传递、函数作为变量和参数、自定义数据类型以及返回值为切片类型的函数。
87 2
Golang语言之函数(func)基础篇