1. 排序
Go 语言中包含 sort 包,允许对可比数据类型(如数字和字符串)执行排序操作。在下面的代码中,定义了一个存储整数的切片。然后,使用 sort 包中的 Ints 函数对切片中的值进行排序。
package main
import (
"fmt"
"sort"
)
func main() {
numbers := []int{67, 18, 62, 60, 25, 64, 75, 5, 17, 55}
fmt.Println("Original Numbers:", numbers)
sort.Ints(numbers)
fmt.Println("Sorted Numbers:", numbers)
}
在这段代码中,使用 sort 包来执行 Ints 函数,该函数按升序对切片进行排序。这是通过将切片的名称传递给函数来完成的。
sort.Ints(numbers)
已排序的值被存储回原始切片中,并替换原始值的顺序。结果是一个排序后的切片,如输出所示。
Original Numbers: [67 18 62 60 25 64 75 5 17 55]
Sorted Numbers: [5 17 18 25 55 60 62 64 67 75]
还可以使用 sort 包按字母顺序对字符串进行排序,如下面代码所示:
package main
import (
"fmt"
"sort"
)
func main() {
words := []string{"camel", "zebra", "horse", "dog", "elephant", "giraffe"}
fmt.Println("Original slice:", words)
sort.Strings(words)
fmt.Println("Sorted slice:", words)
}
这个程序采用与前一个例子相同的逻辑,但使用的字符串而不是数字。要对字符串进行排序,可以使用 sort 包中的 Strings 函数。同样,排序后的值会替换切片中的原始值。输出如下所示:
Original slice: [camel zebra horse dog elephant giraffe]
Sorted slice: [camel dog elephant giraffe horse zebra]
1.1 检查排序后的值
要确定切片或字符串数组是否已排序,可使用 sort 包中的 StringsAreSorted 函数。如果输入的数据已排序,StringsAreSorted 将返回 true,否则返回 false。下面代码展示了如何使用该函数:
package main
import (
"fmt"
"sort"
)
func main() {
words := []string{"camel", "zebra", "horse", "dog", "elephant", "giraffe"}
fmt.Println("Original slice:", words)
fmt.Println("The original values are sorted:", sort.StringsAreSorted(words))
sort.Strings(words)
fmt.Println("Sorted slice:", words)
fmt.Println("The values are sorted:", sort.StringsAreSorted(words))
}
在这个代码清单中,创建了一个单词数组并将其打印到屏幕上。然后使用 sort.StringsAreSorted 进行检查,查看单词是否已排序。在本例中,我们知道它们没有被排序,因此返回值为 false。接着使用 sort.Strings 对之前的字符串进行排序,然后再次打印它们并检查它们是否已排序。
注意,我们前后检查了字符串中的单词是否被排序,一次是对原始切片,另一次是对排序后的切片。最终的输出结果如下所示:
Original slice: [camel zebra horse dog elephant giraffe]
The original values are sorted: false
Sorted slice: [camel dog elephant giraffe horse zebra]
The values are sorted: true
要确定其他类型的数据是否已排序,可以使用类似 StringsAreSorted 的函数。函数的名称类似,格式如下:
sort.DatatypeAreSorted(slice)
其中,Datatype 可以替换为要检查数据的类型。例如,对于整数来说,函数名为 sort.IntsAreSorted; 对 float64 类型来说,函数名为 sort.Float64sAreSorted。传递的 Slice 需要包含相应类型的值。
1.2 自定义排序函数
如果你希望根据特定标准对数据进行排序,那么可以构建自己的函数并将其嵌入 sort 包中。假如,假设希望按每个单词的字符数而不是按字母顺序对一组单词进行排序。sort 包带有 Sort 接口,可以根据自己的逻辑实现该接口以创建自定义排序算法。
1.3 改变排序顺序
Go 还提供了一种方法,用于反转已使用 Sort 接口的切片的排序顺序。反转排序顺序的方法是 sort.Reverse。
2. 时间和日期操作
Go 语言提供了一个强大的 time 包,可用于操作日期和时间值。例如,可以使用下面代码所示的 Now 函数获取系统的当前日期和时间。
2.1 定义时间
检索系统中的日期和时间值通常很有用,但也可以定义一个日期/时间值并分析该值。下面代码定义了特定的日期和时间,然后从该定义中检索值。
2.2 比较时间
可以使用 Go 函数比较两个时间,确定哪个时间更早。在下面代码中,比较了一个自定义时间和当前时间来确定哪个时间更早。可以使用 time 包提供的函数来实现这一点。
2.3 时间计算
我们还可以使用 time 包执行计算,例如日期相减、相加等。
2.3.1 确定日期差值
通过使用减法,可以确定两个日期之间的差值。当从一个时间值中减去另一个时间值时,Go 返回这两个值之间的时间长度。可以在下面代码中看到具体实现。
2.3.2 为日期/时间添加持续时间
2.3.3 小时、分钟、秒的加法
2.3.4 添加年、月和天数
2.4 解析时间
在 Go 语言中,可以使用 time.Parse 函数将字符串解析为时间值。这使用得你可以通过用户输入或从数据文件接收字符串格式的日期,然后根据需要将其转换为时间值。下面代码处理代表时间的字符串,将其解析为我们所需的各个时间部分。
2.5 使用 UNIX 时间
在 Go 时间函数中,还可以使用 UNIX 时间表示方式。下面代码展示了两种以 UNIX 格式显示时间的方法。
2.6 格式化标准时间
另一种显示日期的选项是使用更友好的标准时间格式。下面代码使用 RFC1123Z 标准格式化日期。
3. 正则表达式
正则表达式(也称为 regex 或 regexp)是计算机语言中广泛使用的通用工具。它包括标准搜索模式,允许我们在更大的字符串模式中搜索特定的字符串值。
Go 语言中有一个专门用于正则表达式的包 regexp,它允许在字符串中执行正则表过式搜索。下面代码清单展示了两个使用基本的正则表达式和 MatchString 函数进行搜索的例子。
package main
import (
"fmt"
"regexp"
)
func main() {
m1, err1 := regexp.MatchString("^C([a-z]+)n$", "Catelyn")
fmt.Println(m1)
fmt.Println(err1)
m2, err2 := regexp.MatchString("[0-9]", "jonathan6smith")
fmt.Println(m2)
fmt.Println(err2)
}
在第一个示例中,使用以下模式作为搜索字符串。
C([a-z]+)n
regexp 包将此解释为以 C 开头,包含任意数量的字母,并以 n 结尾的字符串。名称 Catelyn 符合此模式,因此程序返回 true。可以看到 MatchString 函数包括错误检查,因此在 m1 中捕获 true 或 false 返回值以及返回给 err1 的任何错误信息。