数据结构的堆栈:

堆:堆可以被看成是一棵树,如:堆排序。在队列中,调度程序反复提取队列中第一个作业并运行,因为实际情况中某些时间较短的任务将等待很长时间才能结束,或者某些不短小,但具有重要性的作业,同样应当具有优先权。

堆即为解决此类问题设计的一种数据结构。 (推荐学习:go)

栈:一种先进后出的数据结构。

堆栈缓存方式

栈使用的是一级缓存, 他们通常都是被调用时处于存储空间中,调用完毕立即释放。

堆则是存放在二级缓存中,生命周期由虚拟机的垃圾回收算法来决定(并不是一旦成为孤儿对象就能被回收)。所以调用这些对象的速度要相对来得低一些。

堆栈跟踪

下面讨论堆栈跟踪信息以及如何在堆栈中识别函数所传递的参数。

以下测试案例的版本是Go 1.11

示例:

package mainimport "runtime/debug"func main() {   slice := make([]string, 2, 4)   Example(slice, "hello", 10)}func Example(slice []string, str string, i int) {   debug.PrintStack()}

列表1是一个简单的程序, main函数在第5行调用Example函数。Example函数在第9行声明,它有三个参数,一个字符串slice,一个字符串和一个整数。它的方法体也很简单,只有一行,debug.PrintStack(),这会立即产生一个堆栈跟踪信息:

goroutine 1 [running]:runtime/debug.Stack(0x1, 0x0, 0x0)    C:/Go/src/runtime/debug/stack.go:24 +0xaeruntime/debug.PrintStack()    C:/Go/src/runtime/debug/stack.go:16 +0x29main.Example(0xc000077f48, 0x2, 0x4, 0x4abd9e, 0x5, 0xa)    D:/gopath/src/example/example/main.go:10 +0x27main.main()    D:/gopath/src/example/example/main.go:7 +0x79

堆栈跟踪信息:

第一行显示运行的goroutine是id为 1的goroutine。

第二行 debug.Stack()被调用

第四行 debug.PrintStack() 被调用

第六行 调用debug.PrintStack()的代码位置,位于main package下的Example函数。它也显示了代码所在的文件和路径,以及debug.PrintStack()发生的行数(第10行)。

第八行 也调用Example的函数的名字,它是main package的main函数。它也显示了文件名和路径,以及调用Example函数的行数。

更多相关文章

  1. golang不可重入函数实现
  2. golang的函数怎么写
  3. 从go语言闭包谈函数式编程
  4. go语言中函数与方法介绍
  5. go语言结构体组合函数介绍
  6. golang如何调用函数?
  7. 详解Golang中函数作为值与类型
  8. go语言中普通函数与方法的区别是什么?
  9. 详解Go 中方法与函数的区别

随机推荐

  1. C语言中的三目运算符是什么
  2. c语言是面向什么的语言
  3. C语言中字符串连接函数是什么
  4. C语言中二叉树中序遍历怎么执行?
  5. 一个c语言程序总是从什么开始执行
  6. c++中static关键字的作用是什么?
  7. c语言真假是1和0吗?
  8. 学习asp.net core集成MongoDB的完整步骤
  9. c语言三种基本程序结构是什么?
  10. printf("\n")是什么意思?