go 1.18之后,go语言做出重大更新:支持泛型。这极大地缩减了代码冗余量,但是同时也降低了代码可读性。
它包含了slice、map、tuples等辅助函数,还提供了多个集合之间计算辅助方法,甚至一些搜索查询辅助方法。
生成指定长度、指定范围的随机字符串
### 字符范围
var (
LowerCaseLettersCharset = []rune("abcdefghijklmnopqrstuvwxyz") // 小写英文字母
UpperCaseLettersCharset = []rune("ABCDEFGHIJKLMNOPQRSTUVWXYZ") // 大写英文字母
LettersCharset = append(LowerCaseLettersCharset, UpperCaseLettersCharset...) // 大、小写英文字母
NumbersCharset = []rune("0123456789") // 阿拉伯数字
AlphanumericCharset = append(LettersCharset, NumbersCharset...) // 数字 + 英文字母
SpecialCharset = []rune("!@#$%^&*()_+-=[]{}|;':\",./<>?") // 特殊字符
AllCharset = append(AlphanumericCharset, SpecialCharset...) // 所有字符
)
package main
import (
"fmt"
"github.com/samber/lo"
)
func main() {
result := lo.RandomString(5, lo.LettersCharset)
fmt.Printf("%v", result)
}
----------
输出:disAD
返回字符串的指定位置、指定长度的子串。
package main
import (
"fmt"
"math"
"github.com/samber/lo"
)
func main() {
result1 := lo.Substring("hello", 2, 3)
result2 := lo.Substring("hello", -4, 3)
result3 := lo.Substring("hello", -2, math.MaxUint)
fmt.Printf("%v\n", result1)
fmt.Printf("%v\n", result2)
fmt.Printf("%v\n", result3)
}
----------
输出:
llo
ell
lo
返回字符串包含的字符的单位的个数(中文汉字、英文字母、表情都算一个字符单位)
package main
import (
"fmt"
"github.com/samber/lo"
)
func main() {
result1, chars1 := lo.RuneLength("hellô"), len("hellô")
result2, chars2 := lo.RuneLength(""), len("")
fmt.Printf("%v %v\n", result1, chars1)
fmt.Printf("%v %v\n", result2, chars2)
}
----------
输出:
5 6
1 4
package main
import (
"fmt"
"github.com/samber/lo"
)
func main() {
list := []int64{1, 2, 3, 4}
result := lo.Filter(list, func(nbr int64, index int) bool {
return nbr%2 == 0 // 过滤条件
})
fmt.Printf("%v", result)
}
----------
输出:[2 4]
切片中的每个元素按照映射关系可以映射成新的元素。
package main
import (
"fmt"
"strconv"
"github.com/samber/lo"
)
func main() {
list := []int64{1, 2, 3, 4}
result := lo.Map(list, func(nbr int64, index int) string {
return strconv.FormatInt(nbr*2, 10)
})
fmt.Printf("%v", result)
}
----------
输出:[2 4 6 8]
package main
import (
"fmt"
"strconv"
"github.com/samber/lo"
)
func main() {
list := []int64{1, 2, 3, 4}
result := lo.FilterMap(list, func(nbr int64, index int) (string, bool) {
return strconv.FormatInt(nbr*2, 10), nbr%2 == 0
})
fmt.Printf("%v", result)
}
----------
[4 8]
切片中每个元素可映射成多个元素,并将其展平成一维切片。
package main
import (
"fmt"
"strconv"
"github.com/samber/lo"
)
func main() {
list := []int64{1, 2, 3, 4}
result := lo.FlatMap(list, func(nbr int64, index int) []string {
return []string{
strconv.FormatInt(nbr, 10), // base 10
strconv.FormatInt(nbr, 2), // base 2
}
})
fmt.Printf("%v", result)
}
----------
输出:[1 1 2 10 3 11 4 100]
agg维持累加结果,item是切片的每个元素。
package main
import (
"fmt"
"github.com/samber/lo"
)
func main() {
list := []int64{1, 2, 3, 4}
result := lo.Reduce(list, func(agg int64, item int64, index int) int64 {
return agg * item
}, 1) // 1: 累加器的初始值
fmt.Printf("%v", result)
}
package main
import (
"fmt"
"github.com/samber/lo"
)
func main() {
list := []int64{1, 2, 3, 4}
lo.ForEach(list, func(x int64, _ int) {
fmt.Println(x)
})
}
----------
输出:
1
2
3
4
未完待续。。。