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

                                              作者:尹正杰

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

一.字符串定义

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://www.cnblogs.com/yinzhengjie/p/18241346
posted @ 2024-07-04 23:35  尹正杰  阅读(123)  评论(0编辑  收藏  举报