[go]实验包exp简介

本文介绍了Go语言实验包exp中的constraints、maps和rand模块,展示了如何处理复数、浮点数、整数及映射的高效操作,以及随机数生成。通过Shuffle函数演示了同时操作切片和字符串的例子。
摘要由CSDN通过智能技术生成


go官方实验包 https://pkg.go.dev/golang.org/x/exp中包含很多有用的包;通过 go get golang.org/x/exp可方便获取。

exp包

exp包是实验性的,后续可能会合并到主分支或废弃;并且不能保证与Go1的兼容性。

constraints

constraints包中定义了一些有用的泛型参数约束集合:

  • Complex:复数
  • Float:浮点数
  • Integer:整数
    • Signed:有符号整数
    • Unsigned:无符号整数
  • Ordered:数字与字符串

maps

maps中定义了一些有用的方法,用于处理map与类型:

  • Clear(m):清空m中的条目;
  • Clone(m):返回m的一个拷贝(键与值皆浅拷贝);
  • Copy(dst, src):把src中的条目追加到dst中(同名键被覆盖);
  • DeleteFunc(m, del func(K, V) bool):删除满足条件的条目;
  • Equal(m1, m2):比较两个map是否相等
  • EqualFunc(m1, m2, eq func(V1, V2) bool):根据条件比较两个map是否相等;
  • Keys(m)[]K:返回map中的所有键(顺序不确定);
  • Values(m)[]V:返回map中的所有值(顺序不确定);

rand

rand包中实现了伪随机数生成器:

  • ExpFloat64() float64:以指数形式返回(0, +math.MaxFloat64] 间数;
  • Float32() float32:返回[0.0,1.0)间浮点数;
  • Float64() float64:返回[0.0,1.0)间浮点数;
  • Int() int:返回非负的整数;
  • Int31() int32:返回非负的31位整数;
  • Int31n(n int32) int32:返回[0,n)间的整数;
  • Int63() int64:返回非负的整数;
  • Int63n(n int64) int64:返回非负的63位整数;
  • Intn(n int) int:返回[0,n)间的整数;
  • NormFloat64() float64:返回满足正态分布的 [-math.MaxFloat64, +math.MaxFloat64]间的数;
  • Perm(n int) []int:返回包含[0,n)间所有数字的切片(顺序随机);
  • Read(p []byte) (n int, err error):填充p为随机数;
  • Seed(seed uint64):设定随机种子;
  • Shuffle(n int, swap func(i, j int)):洗牌(根据i,j交换元素);
  • Uint32() uint32:返回32位无符号整数;
  • Uint64() uint64:返回64位无符号整数;
func main() {
	numbers := []byte("12345")
	letters := []byte("ABCDE")
	// Shuffle numbers, swapping corresponding entries in letters at the same time.
	rand.Shuffle(len(numbers), func(i, j int) {
		numbers[i], numbers[j] = numbers[j], numbers[i]
		letters[i], letters[j] = letters[j], letters[i]
	})
	for i := range numbers {
		fmt.Printf("%c: %c\n", letters[i], numbers[i])
	}
}

slices

slices中定义了一些处理切片有用的方法:

  • BinarySearch(x []E, target E) (int, bool):在以升序排列的切片中二分查找(若找到,返回其下标;否则为其应插入的位置);
  • BinarySearchFunc(x []E, target E, cmp func(E, E) int) (int, bool):以指定的方式进行二分查找;
  • Clip(s S) S:裁剪(移除多余的未用空间);
  • Clone(s S) S:复制切片(元素使用浅拷贝);
  • Compact(s S) S:返回压缩(移除相邻的相同元素,只留一个副本)后的切片,原切片也被修改(但长度未变);
  • CompactFunc(s S, eq func(E, E) bool) S:使用指定方式压缩;
  • Compare(s1, s2 []E) int:比较;
  • CompareFunc(s1 []E1, s2 []E2, cmp func(E1, E2) int) int:比较;
  • Contains(s []E, v E) bool:是否存在;
  • Delete(s S, i, j int) S:移除[i:j)间元素;
  • Equal(s1, s2 []E) bool:是否相等;
  • EqualFunc(s1 []E1, s2 []E2, eq func(E1, E2) bool) bool:是否相等;
  • Grow(s S, n int) S:增加容量;
  • Index(s []E, v E) int:返回v首次出现的索引,未找到返回-1;
  • IndexFunc(s []E, f func(E) bool) int:按指定方式查找;
  • Insert(s S, i int, v …E) S:在i位置插入元素;
  • IsSorted(x []E) bool:判断是否排序;
  • IsSortedFunc(x []E, less func(a, b E) bool) bool:判断是否排序;
  • Sort(x []E):排序(升序);
  • SortFunc(x []E, less func(a, b E) bool):按指定方式排序;
  • SortStableFunc(x []E, less func(a, b E) bool):稳定排序;
func deleteElem() {
	s := []int{1, 2, 3, 4, 5, 6, 7}
	fmt.Println("before:", s)
	s2 := slices.Delete(s, 0, 1)
	fmt.Println("ori:", s)
	fmt.Println("del:", s2)
}

// before: [1 2 3 4 5 6 7]
// ori: [2 3 4 5 6 7 7]
// del: [2 3 4 5 6 7]  
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值