golang 数组随机排序的实现

 更新时间:2021年12月26日 10:54:25   作者:董洪臣  
本文主要介绍了golang 数组随机排序的实现,文中通过示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下

前言

目前接到一个推荐数据的需求,需要将数据库中获取到的数据进行随机排序后返回给用户。考虑了一下,有两种使用方式,一种是通过数据库 order by rand() ,还有一种就是本文需要使用到的代码处理

具体实现步骤如下

1.引入库

代码如下:

import (
 "fmt"
 "math/rand"
 "time"
)

2.组装数据并排序(方案一)

代码如下:

type CategoryEntity struct {
 GrouponId     int64  //团ID
 MerchandiseId int64  //商品ID
 CategoryId    int64  //分类ID
 CategoryTitle string //分类名称
}

func main() {
 data := make([]CategoryEntity, 10)
 data[0] = CategoryEntity{GrouponId: 0, MerchandiseId: 1117891, CategoryId: 726, CategoryTitle: "蔬菜"}
 data[1] = CategoryEntity{GrouponId: 1, MerchandiseId: 1110162, CategoryId: 1505, CategoryTitle: "调料调味"}
 data[2] = CategoryEntity{GrouponId: 2, MerchandiseId: 1117822, CategoryId: 746, CategoryTitle: "水果"}
 data[3] = CategoryEntity{GrouponId: 3, MerchandiseId: 1115770, CategoryId: 1408, CategoryTitle: "个人护理"}
 data[4] = CategoryEntity{GrouponId: 4, MerchandiseId: 1116528, CategoryId: 732, CategoryTitle: "肉"}
 data[5] = CategoryEntity{GrouponId: 5, MerchandiseId: 1116526, CategoryId: 727, CategoryTitle: "休闲食品"}
 data[6] = CategoryEntity{GrouponId: 6, MerchandiseId: 1117188, CategoryId: 728, CategoryTitle: "粮油调味"}
 data[7] = CategoryEntity{GrouponId: 7, MerchandiseId: 1117379, CategoryId: 726, CategoryTitle: "蔬菜"}
 data[8] = CategoryEntity{GrouponId: 8, MerchandiseId: 1118166, CategoryId: 1005, CategoryTitle: "居家百货"}
 data[9] = CategoryEntity{GrouponId: 9, MerchandiseId: 1117377, CategoryId: 746, CategoryTitle: "水果"}

 fmt.Println("随机前:", data)
 //如果不使用rand.Seed(seed int64),每次运行,得到的随机数会一样
 rand.Seed(time.Now().Unix())
 //采用rand.Shuffle,将切片随机化处理后返回
 rand.Shuffle(len(data), func(i, j int) { data[i], data[j] = data[j], data[i] })
 fmt.Println("随机后:", data)
}

3.组装数据并排序(方案二)

代码如下:

type CategoryEntity struct {
 GrouponId     int64  //团ID
 MerchandiseId int64  //商品ID
 CategoryId    int64  //分类ID
 CategoryTitle string //分类名称
}

func main() {
 data := make([]CategoryEntity, 10)
 data[0] = CategoryEntity{GrouponId: 0, MerchandiseId: 1117891, CategoryId: 726, CategoryTitle: "蔬菜"}
 data[1] = CategoryEntity{GrouponId: 1, MerchandiseId: 1110162, CategoryId: 1505, CategoryTitle: "调料调味"}
 data[2] = CategoryEntity{GrouponId: 2, MerchandiseId: 1117822, CategoryId: 746, CategoryTitle: "水果"}
 data[3] = CategoryEntity{GrouponId: 3, MerchandiseId: 1115770, CategoryId: 1408, CategoryTitle: "个人护理"}
 data[4] = CategoryEntity{GrouponId: 4, MerchandiseId: 1116528, CategoryId: 732, CategoryTitle: "肉"}
 data[5] = CategoryEntity{GrouponId: 5, MerchandiseId: 1116526, CategoryId: 727, CategoryTitle: "休闲食品"}
 data[6] = CategoryEntity{GrouponId: 6, MerchandiseId: 1117188, CategoryId: 728, CategoryTitle: "粮油调味"}
 data[7] = CategoryEntity{GrouponId: 7, MerchandiseId: 1117379, CategoryId: 726, CategoryTitle: "蔬菜"}
 data[8] = CategoryEntity{GrouponId: 8, MerchandiseId: 1118166, CategoryId: 1005, CategoryTitle: "居家百货"}
 data[9] = CategoryEntity{GrouponId: 9, MerchandiseId: 1117377, CategoryId: 746, CategoryTitle: "水果"}

 fmt.Println("随机前:", data)
 //如果不使用rand.Seed(seed int64),每次运行,得到的随机数会一样
 rand.Seed(time.Now().Unix())
 length := len(data)
 for i := 0; i < length; i++ {
  exchange(data, rand.Intn(length), i)
 }

 fmt.Println("随机后:", data)
}

// 交换数据
func exchange(data []CategoryEntity, i, j int) {
 data[i], data[j] = data[j], data[i]
}

总结

整体比较简单,但是需要注意的有两点:

1:golang中 rand的使用方式,如果不使用rand.Seed(seed int64),每次运行,得到的随机数会一样

2:方案一种采用rand.Shuffle+匿名函数,将切片随机化处理后返回。

3:方案二使用golang特有的数组交换方式:

func exchange(data []CategoryEntity, i, j int) {
 data[i], data[j] = data[j], data[i]
}

到此这篇关于golang 数组随机排序的实现的文章就介绍到这了,更多相关golang 数组随机排序内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • go语言中数据接口set集合的实现

    go语言中数据接口set集合的实现

    set集合是一种常见的数据结构,它代表了一个唯一元素的集合,本文主要介绍了set的基本特性,包括唯一性、无序性、可变性和集合运算,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2024-10-10
  • GoFrame glist 基础使用和自定义遍历

    GoFrame glist 基础使用和自定义遍历

    这篇文章主要为大家介绍了GoFrame glist的基础使用和自定义遍历示例详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2022-06-06
  • 聊聊Golang中很好用的viper配置模块

    聊聊Golang中很好用的viper配置模块

    这篇文章主要介绍了Golang中很好用的viper配置模块用法,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2020-12-12
  • Go类型断言提取测试接口值动态类型及静态转换确保类型接口编译安全

    Go类型断言提取测试接口值动态类型及静态转换确保类型接口编译安全

    这篇文章主要为大家介绍了Go类型断言提取测试接口值动态类型及静态转换确保类型实现特定接口的编译时安全性详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2023-10-10
  • Go语言依赖管理三要素示例解析

    Go语言依赖管理三要素示例解析

    这篇文章主要介绍了Go语言依赖管理三要素及示例解析,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2023-01-01
  • VSCode配置Go插件和第三方拓展包的详细教程

    VSCode配置Go插件和第三方拓展包的详细教程

    这篇文章主要介绍了VSCode配置Go插件和第三方拓展包的详细教程,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2020-05-05
  • 详解golang开发中select多路选择

    详解golang开发中select多路选择

    这篇文章主要介绍了golang开发中select多路选择,本文通过实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2020-09-09
  • Go语言获取系统性能数据gopsutil库的操作

    Go语言获取系统性能数据gopsutil库的操作

    这篇文章主要介绍了Go语言获取系统性能数据gopsutil库的操作,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2020-12-12
  • 一文带你了解Go语言中的函数

    一文带你了解Go语言中的函数

    函数是编程中不可或缺的组成部分,在本文中,我们将详细介绍Go语言中函数的概念和使用方法,包括函数的定义、参数和返回值等,需要的可以参考一下
    2023-06-06
  • golang实现http server提供文件下载功能

    golang实现http server提供文件下载功能

    这篇文章主要介绍了golang实现http server提供文件下载功能,本文给大家简单介绍了Golang的相关知识,非常不错,具有一定的参考借鉴价值,需要的朋友可以参考下
    2020-02-02

最新评论