- 前言
- Go 与操作系统
- Go 内部机制
- Go 基本数据类型
- 4 组合类型的使用
- 5 数据结构
- 6 Go package 中不为人知的知识
- 7 反射和接口
- 8 Go UNIX 系统编程
- 08.1 关于 UNIX 进程
- 08.2 flag 包
- 8.2 flag 包
- 08.3 io.Reader 和 io.Writer 接口
- 08.4 bufio 包
- 08.5 读取文本文件
- 08.6 从文件中读取所需的数据量
- 08.7 为什么我们使用二进制格式
- 08.8 读取 CSV 文件
- 08.9 写入文件
- 08.10 从磁盘加载和保存数据
- 08.11 再看strings包
- 08.12 关于bytes包
- 08.13 文件权限
- 08.14 处理 Unix 信号
- 08.15 Unix 管道编程
- 08.16 遍历目录树
- 08.17 使用 ePBF
- 08.18 关于 syscall.PtraceRegs
- 08.19 跟踪系统调用
- 08.20 User ID 和 group ID
- 08.21 其他资源
- 08.22 练习
- 08.23 总结
- 9 并发 Goroutines、Channel 和 Pipeline
- 10 Go 并发-进阶讨论
- 11 代码测试、优化及分析
- 12 Go 网络编程基础
- 13 网络编程 - 构建服务器与客户端
04.5.3 关于字符串处理的包
Go在strings
包里面提供了很多操作UTF-8字符串的强大工具,大部分的工具将会在useStrings.go
介绍,与文件IO相关的 操作将会在第8章详细介绍。
useStrings.go
的第一部分代码:
> package main
>
> import (
> "fmt"
> s "strings"
> "unicode"
> )
>
> var f = fmt.Printf
s "strings"
的导包方式是非常推荐的,意味着我们给strings包起了一个简短的包名,这样就可以使用s.FunctionName()
而不必使用strings.FunctionName()
。
当你频繁使用某个包中的函数的时候,也可以将该函数赋值给一个变量,像上面的代码一样,var f = fmt.Printf
,接下来就可以用f
代替fmt.Printf()
。要注意的是不要过度使用该特性,不然你的代码可读性会变得很差。
第二部分代码:
> unc main() {
> upper := s.ToUpper("Hello there!")
> f("To Upper: %s\n", upper)
> f("To Lower: %s\n", s.ToLower("Hello THERE"))
>
> f("%s\n", s.Title("tHis wiLL be A title!"))
>
> f("EqualFold: %v\n", s.EqualFold("Mihalis", "MIHAlis"))
> f("EqualFold: %v\n", s.EqualFold("Mihalis", "MIHAli"))
这段代码提供了很多玩转字符串的例子,strings.EqualFold()
函数能够判断两个字符串是否相同。
第三部分代码:
> f("Prefix: %v\n", s.HasPrefix("Mihalis", "Mi"))
> f("Prefix: %v\n", s.HasPrefix("Mihalis", "mi"))
> f("Suffix: %v\n", s.HasSuffix("Mihalis", "is"))
> f("Suffix: %v\n", s.HasSuffix("Mihalis", "IS"))
>
> f("Index: %v\n", s.Index("Mihalis", "ha"))
> f("Index: %v\n", s.Index("Mihalis", "Ha"))
> f("Count: %v\n", s.Count("Mihalis", "i"))
> f("Count: %v\n", s.Count("Mihalis", "I"))
> f("Repeat: %s\n", s.Repeat("ab", 5))
>
> f("TrimSpace: %s\n", s.TrimSpace(" \tThis is a line. \n"))
> f("TrimLeft: %s", s.TrimLeft(" \tThis is a\t line. \n", "\n\t "))
> f("TrimRight: %s\n", s.TrimRight(" \tThis is a\t line. \n", "\n\t "))
strings.Count()
函数能够计算第二个参数(字符串类型),在第一个参数(字符串类型)中出现的次数;strings.HasPrefix()
函数判断字符串是否是以某字符串开头,如果是的话便返回true
;同样,strings.HasSuffix()
判断字符串是否以某字符串结尾。
第四部分代码:
> f("Compare: %v\n", s.Compare("Mihalis", "MIHALIS"))
> f("Compare: %v\n", s.Compare("Mihalis", "Mihalis"))
> f("Compare: %v\n", s.Compare("MIHALIS", "MIHalis"))
>
> f("Fields: %v\n", s.Fields("This is a string!"))
> f("Fields: %v\n", s.Fields("Thisis\na\tstring!"))
>
> f("%s\n", s.Split("abcd efg", ""))
> f("%s\n", s.Replace("abcd efg", "", "_", -1))
> f("%s\n", s.Replace("abcd efg", "", "_", 4))
> f("%s\n", s.Replace("abcd efg", "", "_", 2))
这部分展示了strings
比较高级的一些函数。strings.Split()
能够以特定字符分割字符串,并返回一个字符串切片。
strings.Compare()
函数用于比较两个字符串是否相等,相等返回true
,否则返回1或者-1(strings.Compare(a,b),如果ab,意思是出现在字母表中的顺序,译者加)。
strings.Fields()
按照空格将字符串分割。
strings.Split()
非常有用,你迟早会在自己的程序中用到它!
最后一部分代码:
> lines := []string{"Line 1", "Line 2", "Line 3"}
> f("Join: %s\n", s.Join(lines, "+++"))
>
> f("SplitAfter: %s\n", s.SplitAfter("123++432++", "++"))
>
> trimFunction := func(c rune) bool {
> return !unicode.IsLetter(c)
> }
> f("TrimFunc: %s\n", s.TrimFunc("123 abc ABC \t .", trimFunction))
> }
最后一部分代码提供的方法非常好理解,而且功能强大:
strings.Replace()
函数需要4个参数,第一个是你要处理的字符串,第二个是你准备替换的字符,第三个是你要用该字符去替换,第四个参数是你要替换的数量,如果是-1
就意味着你会替换所有要替换的字符。
strings.TrimFunc()
函数可按照自定义函数获取你感兴趣的内容;
strings.SplitAfter()
函数基于指定分隔符将字符串分割。
执行useStrings.go
的输出如下:
$ go run useStrings.go
To Upper: HELLO THERE! To Lower: hello there THis WiLL Be A Title! EqualFold: true EqualFold: false Prefix: true Prefix: false Suffix: true Suffix: false Index: 2 Index: -1 Count: 2 Count: 0 Repeat: ababababab TrimSpace: This is a line. TrimLeft: This is a line. TrimRight: This is a line. Compare: 1 Compare: 0 Compare: -1 Fields: [This is a string!] Fields: [Thisis a string!] [a b c d e f g] _a_b_c_d_ _e_f_g_ _a_b_c_d efg _a_bcd efg Join: Line 1+++Line 2+++Line 3 SplitAfter: [123++ 432++ ] TrimFunc: abc ABC
官方strings
包中的方法远比useStrings.go
中所展示的多,如果你正在写的代码是关于文本处理的,那么你应该阅读]strings
的官方文档以了解更多。
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论