go1.18版本最大的变化是开始支持泛型。

关键字any的引入

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
# 查看当前项目下的interface{}使用情况
$find . -name "*.go"|xargs grep "interface{}"

# 查看此次替换会影响到的源文件列表
$gofmt -l -r 'interface{} -> any' .

# 实施全局替换
$gofmt -w -r 'interface{} -> any' .

## 注意:gofmt不会替换注释中的interface{}

# 最后,可以使用下面名了检查替换情况
$find . -name "*.go"|xargs grep "interface{}"

go1.17开始支持切片转换为数组指针

支持将切片转换为数组指针

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
// 数组可以转换成切片
func array2slice() {
 var a = [5]int{11, 12, 13, 14, 15}
 var b = a[0:len(a)] // or var b = a[:]
 b[1] += 10
 fmt.Printf("%v\n", b) // [11 22 13 14 15]
}

// 之前版本不允许切片转换成数组
func slice2array() {
 var b = []int{11, 12, 13}
 var a = [3]int(b) // 报错:cannot convert b (type []int) to type [3]int
 fmt.Printf("%v\n", a)
}

// go 1.17版本开始,可以切片转数组指针
func slice2arrayptr() {
 var b = []int{11, 12, 13}
 var p = (*[3]int)(b) // 这里必须是指针类型
 p[1] = p[1] + 10
 fmt.Printf("%v\n", b) // [11 22 13]
}

unsafe包新增了两个“语法糖”函数

1
2
3
// $GOROOT/src/unsafe.go
func Add(ptr Pointer, len IntegerType) Pointe
func Slice(ptr *ArbitraryType, len IntegerType) []ArbitraryType

(完)