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 型。

 

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值