golang学习系列——10. 字符串

目录

 

1. 说明

2. 赋值

2.1 解释字符串

2.2 非解释字符串

3. 零值

4. 运算

4.1 比较

4.2 索引

4.3 拼接+

5. 包 strings (对于字符串的预定义处理函数)

6. 包 strconv (字符串相关的类型转换)


1. 说明

golang 中的字符串是 UTF-8 字符的一个序列(当字符为 ASCII 码时则占用 1 个字节,其它字符根据需要占用 2-4 个字节)。

UTF-8 是被广泛使用的编码格式,是文本文件的标准编码,其它包括 XML 和 JSON 在内,也都使用该编码。

由于该编码对占用字节长度的不定性,Go 中的字符串里面的字符也可能根据需要占用 1 至 4 个字节,这与其它语言如 C++、Java 或者 Python 不同(Java 始终使用 2 个字节)。这样做的好处是不仅减少了内存和硬盘空间占用,同时也不用像其它语言那样需要对使用 UTF-8 字符集的文本进行编码和解码。

字符串是一种值类型,且值不可变,即创建某个文本后你无法再次修改这个文本的内容;更深入地讲,字符串是字节的定长数组

2. 赋值

2.1 解释字符串

该类字符串使用双引号括起来,其中的相关的转义字符将被替换,这些转义字符包括:

  • \n:换行符
  • \r:回车符
  • \t:tab 键
  • \u 或 \U:Unicode 字符
  • \\:反斜杠自身

2.2 非解释字符串

该类字符串使用反引号括起来,支持换行,例如:

  `This is a raw string \n` 中的 `\n\` 会被原样输出。

3. 零值

零值为长度为零的字符串,即空字符串 ""

和 C/C++不一样,Go 中的字符串是根据长度限定,而非特殊字符\0

4. 运算

4.1 比较

一般的比较运算符(==!=<<=>=>)通过在内存中按字节比较来实现字符串的对比。

func testStrcmp(stra, strb string) {
	if stra > strb {
		fmt.Println("a > b")
	} else if stra < strb {
		fmt.Println("a < b")
	} else {
		fmt.Println("a = b")
	}
}

func main() {
	testStrcmp("abcc", "abcd")
	testStrcmp("abcd", "abcd")
	testStrcmp("abce", "abcd")
	testStrcmp("abcde", "abcd")
}

测试结果如下:

4.2 索引

通过函数 len() 来获取字符串所占的字节长度,例如:len(str)

字符串的内容(纯字节)可以通过标准索引法来获取,在中括号 [] 内写入索引,索引从 0 开始计数:

  • 字符串 str 的第 1 个字节:str[0]
  • 第 i 个字节:str[i - 1]
  • 最后 1 个字节:str[len(str)-1]

注意事项

这种转换方案只对纯 ASCII 码的字符串有效。

获取字符串中某个字节的地址的行为是非法的,例如:&str[i]

4.3 拼接+

两个字符串 s1 和 s2 可以通过 s := s1 + s2 拼接在一起。

拼接的简写形式 += 也可以用于字符串

func testStrPend() {
	stra := "1234"
	strb := "abcd"
	s := stra + strb
	fmt.Println(s)
	s += stra
	fmt.Println(s)
}

5. 包 strings (对于字符串的预定义处理函数)

Go 中使用 strings 包来完成对字符串的主要操作。

一些库函数:

1. HasPrefix 判断字符串 s 是否以 prefix 开头

strings.HasPrefix(s, prefix string) bool

2.  HasSuffix 判断字符串 s 是否以 suffix 结尾

strings.HasSuffix(s, suffix string) bool

3.  Contains 判断字符串 s 是否包含 substr

strings.Contains(s, substr string) bool

4.  Index 返回字符串 str 在字符串 s 中的索引(str 的第一个字符的索引),-1 表示字符串 s 不包含字符串 str

strings.Index(s, str string) int

5.  LastIndex 返回字符串 str 在字符串 s 中最后出现位置的索引(str 的第一个字符的索引),-1 表示字符串 s 不包含字符串 str

strings.LastIndex(s, str string) int

6. 查询非 ASCII 编码的字符在父字符串中的位置

strings.IndexRune(s string, r rune) int

7. Replace 用于将字符串 str 中的前 n 个字符串 old 替换为字符串 new,并返回一个新的字符串,如果 n = -1 则替换所有字符串 old 为字符串 new

strings.Replace(str, old, new, n) string

8. Count 用于计算字符串 str 在字符串 s 中出现的非重叠次数:

strings.Count(s, str string) int

9. Repeat 用于重复 count 次字符串 s 并返回一个新的字符串:

strings.Repeat(s, count int) string

10. 字符串中的 Unicode 字符全部转换为相应的大/小写字符

strings.ToLower(s) string
strings.ToUpper(s) string

11. 修改字符串

strings.TrimSpace(s)   剔除字符串开头和结尾的空白符号
strings.Trim(s, "cut") 剔除字符串开头和结尾的指定字符 cut
TrimLeft、TrimRight 来剔除开头或者结尾的字符串

12. 分割字符串

strings.Fields(s) 用空白符号作为分隔符将字符串分割成一个 slice,如果只包含空白符号,则返回长度为 0 的 slice。
strings.Split(s, sep) 用于自定义分割符号来对指定字符串进行分割,同样返回 slice。

13. 拼接字符串

strings.Join(sl []string, sep string) string       Join 用于将 string 的 slice 使用分割符号来拼接组成一个字符串

6. 包 strconv (字符串相关的类型转换)

该包包含了一些变量用于获取程序运行的操作系统平台下 int 类型所占的位数,如:strconv.IntSize

任何类型 T 转换为字符串总是成功的。

字符串转换为其它类型 tp 并不总是可能的,可能会在运行时抛出错误 parsing "…": invalid argument。

数字类型转换到字符串

strconv.Itoa(i int) string 返回数字 i 所表示的字符串类型的十进制数。
strconv.FormatFloat(f float64, fmt byte, prec int, bitSize int)
fmt 表示格式(其值可以是 'b'、'e'、'f' 或 'g'),prec 表示精度,bitSize 则使用 32 表示 float32,用 64 表示 float64。

字符串类型转换为数字类型

strconv.Atoi(s string) (i int, err error) 将字符串转换为 int 型。
strconv.ParseFloat(s string, bitSize int) (f float64, err error) 将字符串转换为 float64 型。

 

 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值