2021.12.14 Go 1.18 Beta1发布,于是趁着周末有空,赶紧体验一下。


01

安装Go 1.18 Beta1版本


首先,给我们的Goland安装下Go 1.18 Beta1版本
安装完成后,将GOROOT设置成1.18版本
PS:目前的Goland 2021.3版本对泛型语法支持不太好,经常会出现被划一条红色波浪线,但其实是能正常运行的。

02

泛型语法体验


下面我们以两数相加来看下使用泛型前后的差异。使用泛型前:

package main

func main() {
  println(add(1, 2)) // 3
}

// add 两数相加
func add(x, y int) int {
  return x + y
}

如上,入参必须为int,如果是int32、int64则必须强转后再传入。如果使用泛型:

package main

func main() {
  println(add(1, 2)) // 3
}

// add 两数相加
func add[T ~int|~int32|~int64](x, y T) T {
  return x + y
}

与泛型前相比,在函数名后多了[T ~int|~int32|~int64],且入参、出参的类型改成了T,其余不变。


03

泛型的优势


前面的示例只是简单说明下泛型的语法,并没有体现出泛型的优势,下面我们以排序算法来说明下泛型的优势。

有泛型前,标准库sort提供了sort.Ints、sort.Float64s、sort.Strings等多个方法来完成排序;有了泛型后,我们只要实现一个Sort方法即可实现排序功能

package main

import (
  "constraints"
  "fmt"
)

func main() {
  s1 := []int{4, 2, 3, 9, 6}
  fmt.Println("排序前:", s1) // 排序前: [4 2 3 9 6]
  Sort(s1)
  fmt.Println("排序后:", s1) // 排序后: [2 3 4 6 9]

  s2 := []string{"11", "23", "43", "5", "07", "12345"}
  fmt.Println("排序前:", s2) // 排序前: [11 23 43 5 07 12345]
  Sort(s2)
  fmt.Println("排序后:", s2) // 排序后: [07 11 12345 23 43 5]
}

func Sort[T constraints.Ordered](nums []T) []T {
  for i := 1; i < len(nums); i++ {
    for j := i - 1; j >= 0 && nums[j] > nums[j+1]; j-- {
      nums[j], nums[j+1] = nums[j+1], nums[j]
    }
  }
  return nums
}