golang——泛型

189 阅读2分钟

Go语言中的泛型允许我们定义一种操作,该操作可以使用多种类型的参数。这有助于我们避免重复编写代码,并且可以提高代码的可读性和可维护性。

举个例子,假设我们想要定义一个函数,该函数接受一个整型列表并返回列表中最大的数。我们可以这样写:

func findMax(numbers []int) int {
    max := numbers[0]
    for _, num := range numbers {
        if num > max {
            max = num
        }
    }
    return max
}

这个函数能够完成我们想要的操作,但如果我们想要找出一个字符串列表中最长的字符串呢?我们必须再写一个新的函数,这样就重复了代码:

func findLongestString(strings []string) string {
    longest := strings[0]
    for _, s := range strings {
        if len(s) > len(longest) {
            longest = s
        }
    }
    return longest
}

使用泛型,我们可以定义一个函数,该函数接受一个类型为T的列表,并且该函数内部定义了一个比较函数来比较T类型的两个值。这样我们就可以用一个函数完成多种不同类型的操作,而不用写多个重复的函数:

func findMax[T any](numbers []T, compare func(T, T) bool) T {
   max := numbers[0]
   for _, num := range numbers {
      if compare(num, max) {
         max = num
      }
   }
   return max
}

这样,我们就定义了一个泛型函数findMax,它接受一个类型为T的列表和一个函数,该函数接受两个T类型的参数并返回一个bool类型的值。

我们可以用这个函数来查找一个整型列表中最大的数:

func intCompare(a, b int) bool {
    return a > b
}

numbers := []int{1, 2, 3, 4, 5}
max := findMax(numbers, intCompare)

也可以用它来查找一个字符串列表中最长的字符串:

func stringCompare(a, b string) bool {
    return len(a) > len(b)
}

strings := []string{"hello", "world", "this", "is", "a", "test"}
longest := findMax(strings, stringCompare)

泛型的优势在于它允许我们使用一种通用的方式定义函数,并且可以与多种类型配合使用。这有助于我们避免重复编写代码,提高代码的可读性和可维护性。