深入理解与使用go之函数与方法--泛型及堆栈

深入理解与使用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 =

相关推荐

  1. 深入理解使用go函数方法--堆栈

    2024-03-31 12:58:04       16 阅读
  2. 深入理解使用go函数方法--使用

    2024-03-31 12:58:04       18 阅读
  3. 深入理解使用go中间件--实现

    2024-03-31 12:58:04       23 阅读
  4. 深入理解使用go错误处理--实现

    2024-03-31 12:58:04       19 阅读
  5. 深入理解使用go配置--实现

    2024-03-31 12:58:04       19 阅读
  6. 深入理解使用go测试--实现

    2024-03-31 12:58:04       18 阅读

最近更新

  1. TCP协议是安全的吗?

    2024-03-31 12:58:04       16 阅读
  2. 阿里云服务器执行yum,一直下载docker-ce-stable失败

    2024-03-31 12:58:04       16 阅读
  3. 【Python教程】压缩PDF文件大小

    2024-03-31 12:58:04       15 阅读
  4. 通过文章id递归查询所有评论(xml)

    2024-03-31 12:58:04       18 阅读

热门阅读

  1. 【AIGC】阿里云ecs部署stable diffusion

    2024-03-31 12:58:04       15 阅读
  2. Lua与Python区别

    2024-03-31 12:58:04       15 阅读
  3. 优先级队列(堆)

    2024-03-31 12:58:04       18 阅读
  4. 1100-采药

    2024-03-31 12:58:04       14 阅读
  5. 多线程和单线程相比,有哪些优势和劣势?

    2024-03-31 12:58:04       16 阅读
  6. @Controller与@RestController的区别

    2024-03-31 12:58:04       18 阅读