• Golang 接口(interface)最佳实践


    引用类型:指针、slice切片、map、管道chan、interface等都是引用类型,在作为函数参数的时候进行修改会影响到原有的数据。

    实现对Hero结构体切片的排序:sort.Sort(data Interface)

    Interface里面有三个方法可以实现,其实也就是你想调用系统提供的方法,对结构体切片进行排序,那么就需要实现接口的三个方法。

    其实就是在sort函数里面会使用到接口里面提供的排序方法。(其实就是结构体切片类型实现了那个接口的三个方法,那么就可以去调用sort方法来完成对结构体切片的排序)

    结构体的切片类型才能存放多个结构体的变量。

    软件包: sort      func Sort(data Interface)

    1. package main
    2. import (
    3. "fmt"
    4. "math/rand"
    5. "sort"
    6. )
    7. // Hero 声明hero结构体
    8. type Hero struct {
    9. Name string
    10. Age int
    11. }
    12. // HeroSlice 声明hero结构体切片类型
    13. type HeroSlice []Hero
    14. // Len 实现Interface接口,将下面的三个方法都实现了。那么就可以调用Sort包里面的Sort方法了
    15. func (hs HeroSlice) Len() int {
    16. return len(hs)
    17. }
    18. // Less less这个方法就是决定你使用什么标准进行排序
    19. // 按照hero的年龄从小到大排序
    20. func (hs HeroSlice) Less(i, j int) bool {
    21. return hs[i].Age < hs[j].Age
    22. }
    23. func (hs HeroSlice) Swap(i, j int) {
    24. temp := hs[i]
    25. hs[i] = hs[j]
    26. hs[j] = temp
    27. }
    28. func main() {
    29. var heroes HeroSlice
    30. for i := 0; i < 10; i++ {
    31. hero := Hero{
    32. Name: fmt.Sprintf("hero~%d", i),
    33. Age: rand.Intn(100),
    34. }
    35. heroes = append(heroes, hero)
    36. }
    37. for _, v := range heroes {
    38. fmt.Printf("%v", v)
    39. }
    40. //调用sort包里面的sort方法,之所以将切片对应的类型放进去,是因为该类型实现了这三个方法
    41. sort.Sort(heroes)
    42. fmt.Printf("\n排序后的结果..............\n")
    43. for _, v := range heroes {
    44. fmt.Printf("%v", v)
    45. }
    46. }
    47. {hero~0 99}{hero~1 81}{hero~2 46}{hero~3 33}{hero~4 10}{hero~5 72}{hero~6 43}{hero~7 20}{hero~8 43}{hero~9 18}
    48. 排序后的结果..............
    49. {hero~4 10}{hero~9 18}{hero~7 20}{hero~3 33}{hero~6 43}{hero~8 43}{hero~2 46}{hero~5 72}{hero~1 81}{hero~0 99}

    如果不想对年龄进行排序了,想对姓名进行排序,修改如下:

    1. func (hs HeroSlice) Less(i, j int) bool {
    2. return hs[i].Name < hs[j].Name
    3. }

    接口的妙用在于实现了上面的方法,那么其余的事情就交给Sort包里面的Sort方法去做,至于里面如何去调用这三个方法的,就不需要你去管了。

    其实就是这种方式帮你开放了接口,你将接口实现了,那么排序就自动点将字段完成。最后修改一下赋值的语句,这样更加简洁。

    1. func (hs HeroSlice) Swap(i, j int) {
    2. hs[i], hs[j] = hs[j], hs[i]
    3. }

    上面这种方式就有利于我们实现高质量的代码,开放一些接口让别让去使用,同时将最核心的代码交给最核心的人去写。

    将放开的部分开放给别让使用,提供接口。 下面这些方法放开之后就知道按照什么标准排序。能够放开点就放开,不能够放开的就放到内部去。

  • 相关阅读:
    layui select多选下拉显示 以及多值回显
    用dubbo直接调用webservice
    线上教育系统平台,企业如何才能运营呢?
    聊聊数据库建表的15个小技巧
    “揭秘淘宝店铺所有商品接口:一键获取海量热销宝贝信息!“
    【ESP32--FreeRTOS 任务间的同步与通信】
    动态规划:回文串问题(C++)
    力扣(2024.06.12)
    vue学习之列表渲染
    【HMS core】【FAQ】HMS Toolkit典型问题合集1
  • 原文地址:https://blog.csdn.net/qq_34556414/article/details/133803514