go接口编程的最佳实践

 一 需求

实现对 Hero 结构体切片的排序。

二 思路

使用 sort.Sort(data Interface) 函数进行排序,用到了 Interface 接口,需要实现 Interface 接口的三个方法。

三 代码

package main

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

// 1 声明 Hero 结构体
type Hero struct {
   Name string
   Age  int
}

// 2 声明一个 Hero 结构体切片类型
type HeroSlice []Hero

// 3 实现 Interface 接口
func (hs HeroSlice) Len() int {
   return len(hs)
}

// Less方法就是决定你使用什么标准进行排序
// 按Hero的年龄从小到大排序
func (hs HeroSlice) Less(i, j int) bool {
   return hs[i].Age < hs[j].Age
   // 修改成对 Name 排序
   // return hs[i].Name < hs[j].Name
}

func (hs HeroSlice) Swap(i, j int) {
   // 交换
   // temp := hs[i]
   // hs[i] = hs[j]
   // hs[j] = temp
   // 下面这句话等价于上面三句话
   hs[i], hs[j] = hs[j], hs[i]
}

func main() {
   // 先定义一个数组/切片
   var intSlice = []int{0, -1, 10, 7, 90}
   // 要求对 intSlice 切片进行排序
   // 1 冒泡排序
   // 2 可以使用系统提供的方法
   sort.Ints(intSlice)
   fmt.Println(intSlice)

   // 对结构体切片进行排序
   // 1 冒泡排序
   // 2 可以使用系统提供的方法
   var heroes HeroSlice
   for i := 0; i < 10; i++ {
      hero := Hero{
         Name: fmt.Sprintf("英雄|%d", rand.Intn(100)),
         Age:  rand.Intn(100),
      }
      // 将 hero append 到 heroes切片
      heroes = append(heroes, hero)
   }

   // 排序前的顺序
   for _, v := range heroes {
      fmt.Println(v)
   }

   // 调用sort.Sort
   sort.Sort(heroes)
   fmt.Println("-----------排序后------------")
   // 排序后的顺序
   for _, v := range heroes {
      fmt.Println(v)
   }
   // 交换另外一种方法
   i := 10
   j := 20
   i, j = j, i
   fmt.Println("i=", i, "j=", j) // i=20 j = 10
}

四 测试

[-1 0 7 10 90]
{英雄|81 87}
{英雄|47 59}
{英雄|81 18}
{英雄|25 40}
{英雄|56 0}
{英雄|94 11}
{英雄|62 89}
{英雄|28 74}
{英雄|11 45}
{英雄|37 6}
-----------排序后------------
{英雄|56 0}
{英雄|37 6}
{英雄|94 11}
{英雄|81 18}
{英雄|25 40}
{英雄|11 45}
{英雄|47 59}
{英雄|28 74}
{英雄|81 87}
{英雄|62 89}
i= 20 j= 10

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值