专栏首页Golang语言社区Golang 中"泛型"的支持

Golang 中"泛型"的支持

Golang不支持一般的类似java中的标记式泛型。很多人因此而十分不满,认为没有泛型增加了很多工作量。而目前由于泛型支持的复杂性,Golang的设计和实现者并没有把这个泛型支持作为紧急需要增加的特性。但是,如果真的没有泛型,就一定不行了么?答案当然是否定的。没有泛型也可以,而且我觉得代码更简单,直接,有趣(个人观点,勿喷)。

我们这里打算以一些例子来讲解Golang中如何处理这个问题。

首先,我们看一个冒泡排序的问题。针对整型数组切片的排序。

package main



import (

        "fmt"

)



func bubbleSort(array []int) {

        for i := 0; i < len(array); i++ {

                for j := 0; j < len(array)-i-1; j++ {

                        if array[j] > array[j+1] {

                                array[j], array[j+1] = array[j+1], array[j]

                        }

                }

        }

}



func main() {

        a1 := []int{3, 2, 6, 10, 7, 4, 6, 5}

        bubbleSort(a1)

        fmt.Println(a1)

}

上面的例子输出为:

  1. [2 3 4 5 6 6 7 10]

那么,我们如果希望这个bubbleSort能够同时支持float类型数据排序,或者是按照字符串的长度来排序应该怎么做呢?在其他的例如java语言中,我们可以将bubbleSort定义为支持泛型的排序,但是Go里面就不行了。为了达到这个目的,我们可以使用interface来实现相同的功能。

针对上面的排序问题,我们可以分析一下排序的步骤:

  • 查看切片长度,以用来遍历元素(Len);
  • 比较切片中的两个元素(Less);
  • 根据比较的结果决定是否交换元素位置(Swap)。 到这里,或许你已经明白了,我们可以把上面的函数分解为一个支持任意类型的接口,任何其他类型的数据只要实现了这个接口,就可以用这个接口中的函数来排序了。 复制代码 下面,我们就用几个例子来描述一下这个接口的用法。 复制代码 输出结果为: 复制代码 上面的例子中,我们首先定义了一个IntArr类型的整型切片类型,然后让这个类型实现了Sortable接口,然后在测试代码中,这个IntArr类型就可以直接调用Sortable接口的bubbleSort方法了。 另外,我们还演示了一个字符串切片类型StringArr按照字符串长度来排序的例子。和IntArr类型一样,它实现了Sortable即可定义的方法,然后就可以用Sortable即可的bubbleSort方法来排序了。 总结 上面的例子,是一种Golang中支持所谓的“泛型”的方法。这种泛型当然不是真正意义上面的泛型,但是提供了一种针对多种类型的一致性方法的参考实现。
[1 2 3 4 6 10]

[i am go lang hello]
package main



import (

        "fmt"

)



type Sortable interface {

        Len() int

        Less(int, int) bool

        Swap(int, int)

}



func bubbleSort(array Sortable) {

        for i := 0; i < array.Len(); i++ {

                for j := 0; j < array.Len()-i-1; j++ {

                        if array.Less(j+1, j) {

                                array.Swap(j, j+1)

                        }

                }

        }

}



//实现接口的整型切片

type IntArr []int



func (array IntArr) Len() int {

        return len(array)

}



func (array IntArr) Less(i int, j int) bool {

        return array[i] < array[j]

}



func (array IntArr) Swap(i int, j int) {

        array[i], array[j] = array[j], array[i]

}



//实现接口的字符串,按照长度排序

type StringArr []string



func (array StringArr) Len() int {

        return len(array)

}



func (array StringArr) Less(i int, j int) bool {

        return len(array[i]) < len(array[j])

}



func (array StringArr) Swap(i int, j int) {

        array[i], array[j] = array[j], array[i]

}



//测试

func main() {

        intArray1 := IntArr{3, 4, 2, 6, 10, 1}

        bubbleSort(intArray1)

        fmt.Println(intArray1)



        stringArray1 := StringArr{"hello", "i", "am", "go", "lang"}

        bubbleSort(stringArray1)

        fmt.Println(stringArray1)

}
type Sortable interface{

        Len() int

        Less(int, int) bool

        Swap(int, int)

}

本文分享自微信公众号 - Golang语言社区(Golangweb)

原文出处及转载信息见文内详细说明,如有侵权,请联系 yunjia_community@tencent.com 删除。

原始发表时间:2017-08-19

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • 关于Go语言中数组的参数传递问题

    一个很微妙的一个问题。从下面的代码可以看出: 1、类型为“[5]int”的数组在作为参数时,其实作为值来传递的。 2、 类型为“[]int”的数组在作为参数...

    李海彬
  • 【Go 语言社区】 golang 算法课程 第一季 第2节 洗牌算法

    扑克牌洗牌是我们生活中比较喜欢玩的一个游戏。那么我们有没有什么办法自己设计一个扑克牌洗牌的方法呢?在运行库当中有一个随机函数rand,它可以生成0~32767之...

    李海彬
  • Golang插入排序

    package main import ( "fmt" ) func InsertionSort(array [6]int, n int) { var...

    李海彬
  • 剑指Offer-旋转数组的最小数字

    package Array; /** * 旋转数组的最小数字 * 把一个数组最开始的若干个元素搬到数组的末尾,我们称之为数组的旋转。 * 输入一个非递减...

    武培轩
  • 冒泡排序算法(Bubble Sort)

             对比相邻的元素值,如果满足条件就交换元素值,把较小的元素移动到数组的前面,把大的元素移动到

    itlemon
  • 【Python】冒泡排序

    在本科学C++的时候,一个最有意思的程序就是冒泡啦,还记得那可是让无数人摸不清头脑,抓狂到喷血的程序,的确很容易一时转不过来,不过一想通的话马上就觉得代码真的是...

    企鹅号小编
  • 跟我学习php数组常用函数-上篇

    _simple
  • PHP数组array类常见操作示例

    array_diff(arr1,arr2);//计算数组的差集(对比返回在 array1 中但是不在 array2 及任何其它参数数组中的值。)

    砸漏
  • jQuery ajax+PHP实现的级联下拉列表框功能示例

    本文实例讲述了jQuery ajax+PHP实现的级联下拉列表框功能。分享给大家供大家参考,具体如下:

    砸漏
  • 浅谈PHP array_search 和 in_array 函数效率问题

    在一个接口中,发现非常耗时,排查原因发现 array_search 查找数组中的元素的 key 时,效率随着数组变大,耗时增加。特别是大数组时,非常耗时。在函数...

    砸漏

扫码关注云+社区

领取腾讯云代金券