深入理解与使用go之函数与方法–泛型及堆栈
引子
Go 1.18为语言添加了泛型。简而言之,允许先写代码后确定类型。
- 什么时候应该使用,什么时候不能使用
我们在面试过程中经常被问到函数中的堆与栈,那么
- 什么是堆栈,区别是什么
- 什么时候在堆上,什么时候在栈上
- 我们为什么要了解堆栈
带着这些问题,开始我们今天的讨论
泛型
函数式泛型
示例
假设我们有这样一个场景,我们希望知道slice中某个元素是否存在,可能会有string、int、array等元素,在没有泛型之前
我们可能要向如下方式写三个函数
func InArrayInt(ele int, arr []int) int
func InArrayString(ele string, arr []string) int
func InArrayArr(ele [2]int, arr [][2]int) int
如果使用泛型呢,我们先看看,泛型函数的原型
func funcName[T any,...](a T, ...)
结合上面的需求,我们可以快速实现
// InArray 查找元素在slice中的位置
func InArray[T comparable](ele T, arr []T) int {
for index, val := range arr {
if val == ele {
return index
}
}
return -1
}
func main() {
fmt.Println(InArray(12, []int{
1, 3, 4, 5, 6, 7}))
fmt.Println(InArray("lisi", []string{
"zhangsan", "lisi", "wangwu"}))
fmt.Println(InArray([2]int{
15, 16}, [][2]int{
{
15, 17}, {
15, 18}, {
15, 16}}))
}
可能有的同学已经看到了
func InArray[T comparable](ele T, arr []T) int
这里类型 T
为什么不是 interface{}
类型呢
类型说明
首先我们要搞清楚一些概念,从go源码src/builtin/builtin.go
里我们可以看到, 两个我们常看到但不常使用的 类型
// any is an alias for interface{} and is equivalent to interface{} in all ways.
type any =