对Golang中的runtime.Caller使用说明
如下所示:
func Caller(skip int) (pc uintptr, file string, line int, ok bool)
参数:skip是要提升的堆栈帧数,0-当前函数,1-上一层函数,....
返回值:
pc是uintptr这个返回的是函数指针
file是函数所在文件名目录
line所在行号
ok 是否可以获取到信息
示例:
我们分别打印skip为0-3的相关信息
package main import ( "fmt" "runtime" ) func main() { for i := 0 ; i< 4; i++ { test(i) } } func test(skip int) { call(skip) } func call(skip int) { pc,file,line,ok := runtime.Caller(skip) pcName := runtime.FuncForPC(pc).Name() //获取函数名 fmt.Println(fmt.Sprintf("%v %s %d %t %s",pc,file,line,ok,pcName)) }
结果:
4887700 D:/GoProject/src /test/test5.go 19 true main.call 4887585 D:/GoProject/src/ test/test5.go 15 true main.test 4887481 D:/GoProject/src /test/test5.go 10 true main.main 4383501 C:/Go/src/runtime/proc.go 198 true runtime.main
分析结果可以看到
0-3分别上当前函数,当前函数的上一个caller,....
补充:golang打印所有的runtime调用栈
我就废话不多说了,大家还是直接看代码吧~
import "runtime" buf := make([]byte, 1 << 20) runtime.Stack(buf, true) fmt.Printf("\n%s", buf)
以上为个人经验,希望能给大家一个参考,也希望大家多多支持我们。如有错误或未考虑完全的地方,望不吝赐教。
相关推荐
-
golang文件服务器的两种方式(可以访问任何目录)
一.方法1: 主要用到的方法是http包的FileServer,参数很简单,就是要路由的文件夹的路径. package main import ( "fmt" "net/http" ) func main() { http.Handle("/", http.FileServer(http.Dir("./"))) e := http.ListenAndServe(":8080", nil) fmt.Print
-
Golang之defer 延迟调用操作
前言 defer语句被用于预定对一个函数的调用.我们把这类被defer语句调用的函数称为延迟函数.而defer 延迟语句在其他编程语言里好像没有见到.应该是属于 Go 语言里的独有的关键字.但用法类似于面向对象编程语言 Java 和 C# 的 finally 语句块. 下面对defer进行介绍. defer特性 1. 关键字 defer 用于注册延迟调用. 2. 这些调用直到 return 前才被执.因此,可以用来做资源清理. 3. 多个defer语句,按先进后出的方式执行. 1.延迟调用 用法
-
如何判断Golang接口是否实现的操作
前言 在看一个底层库的的时候,看到了一个比较奇怪的写法,于是乎有了本文. 主要探讨两个问题: 1.利用编译来判断Golang接口是否实现 2.延伸出的make和new的区别 正文 1.利用编译来判断Golang接口是否实现 看了一个底层通用链接池的库,有这么一行代码: var _ Pooler = new(WeightedRoundRobin) 需要解释的是:Pooler是一个接口类型. type Pooler interface { // ... } 刚开始看是疑惑的,为什么new了之后是要抛
-
浅谈golang中的&^位清空操作
如下所示: c = a &^ b 含义:b 转为二进制时,值为1 的位置对应c的位置值为0:c中剩余位置值与a对应位置值相同(即:所谓的位清空操作,把b中1对应位置在c位置上清空),详见下面代码 package main import "fmt" func main() { a := 12 b := 4 c := a &^ b fmt.Printf("a: %08b\n", a) fmt.Printf("b:%08b\n", b)
-
Golang获取目录下的文件及目录信息操作
一.获取当前目录下的文件或目录信息(不包含多级子目录) func main() { pwd,_ := os.Getwd() //获取文件或目录相关信息 fileInfoList,err := ioutil.ReadDir(pwd) if err != nil { log.Fatal(err) } fmt.Println(len(fileInfoList)) for i := range fileInfoList { fmt.Println(fileInfoList[i].Name()) //打印
-
golang执行命令操作 exec.Command
我就废话不多说了,大家还是直接看代码吧~ cmd := exec.Command("cmd") in := bytes.NewBuffer(nil) cmd.Stdin = in//绑定输入 var out bytes.Buffer cmd.Stdout = &out //绑定输出 go func() { in.WriteString("node E:/design/test.js\n")//写入你的命令,可以有多行,"\n"表示回车 }
-
解决golang sync.Wait()不执行的问题
goroutine 似乎不用解释太多,可以利用它实现多线程,也可以利用它来实现异步事件. 在使用关键字go的过程中,常常会将用到sync.WaitGroup,如下一段代码. package main import ( "fmt" "sync" "time" ) func Run() { var wg = &sync.WaitGroup{} go func() { wg.Add(1) fmt.Println("halo world
-
对Golang中的runtime.Caller使用说明
如下所示: func Caller(skip int) (pc uintptr, file string, line int, ok bool) 参数:skip是要提升的堆栈帧数,0-当前函数,1-上一层函数,.... 返回值: pc是uintptr这个返回的是函数指针 file是函数所在文件名目录 line所在行号 ok 是否可以获取到信息 示例: 我们分别打印skip为0-3的相关信息 package main import ( "fmt" "runtime"
-
golang中xorm的基本使用说明
简单的用法 package main import ( _ "github.com/go-sql-driver/mysql" "github.com/go-xorm/xorm" "log" ) //定义结构体(xorm支持双向映射) type User struct { User_id int64 `xorm:"pk autoincr"` //指定主键并自增 Name string `xorm:"unique&quo
-
golang中sync.Mutex的实现方法
目录 mutex 的实现思想 golang 中 mutex 的实现思想 mutex 的结构以及一些 const 常量值 Mutex 没有被锁住,第一个协程来拿锁 Mutex 仅被协程 A 锁住,没有其他协程抢锁,协程 A 释放锁 Mutex 已经被协程 A 锁住,协程 B 来拿锁 lockSlow() runtime_doSpin() runtime_canSpin() Mutex 被协程 A 锁住,协程 B 来抢锁但失败被放入等待队列,此时协程 A 释放锁 unlockSlow() Mutex
-
golang中为什么Response.Body需要被关闭详解
前言 本文主要介绍了关于golang中Response.Body需要被关闭的相关内容,文中通过示例代码介绍的非常详细,对各位学习或者使用golang具有一定参考学习价值,下面话不多说了,来一起看看详细的介绍吧 Body io.ReadCloser The http Client and Transport guarantee that Body is always non-nil, even on responses without a body or responses with a zero
-
golang中context的作用详解
当一个goroutine可以启动其他goroutine,而这些goroutine可以启动其他goroutine,依此类推,则第一个goroutine应该能够向所有其它goroutine发送取消信号. 上下文包的唯一目的是在goroutine之间执行取消信号,而不管它们如何生成.上下文的接口定义为: type Context interface { Deadline() (deadline time.Time, ok bool) Done() <- chan struct{} Err() erro
-
解决golang中container/list包中的坑
golang中list包用法可以参看这篇文章 但是list包中大部分对于e *Element进行操作的元素都可能会导致程序崩溃,其根本原因是e是一个Element类型的指针,当然其也可能为nil,但是golang中list包中函数没有对其进行是否为nil的检查,变默认其非nil进行操作,所以这种情况下,便可能出现程序崩溃. 1.举个简单例子 Remove()函数 package main import ( "container/list" "fmt" ) func
-
golang中的并发和并行
golang中默认使用一个CPU,这时程序无法并发,只能是并发.因为始终只有一个CPU在运行. package main import ( "fmt" "runtime" ) //并发和并行 var quit chan int = make(chan int) func loop() { for i := 0; i < 100; i++ { //为了观察,跑多些 fmt.Printf("%d ", i) } quit <- 0 } f
-
Golang中channel的原理解读(推荐)
数据结构 channel的数据结构在$GOROOT/src/runtime/chan.go文件下: type hchan struct { qcount uint // 当前队列中剩余元素个数 dataqsiz uint // 环形队列长度,即可以存放的元素个数 buf unsafe.Pointer // 环形队列指针 elemsize uint16 // 每个元素的大小 closed uint32 // 标记是否关闭 elemtype *_type // 元素类型 sendx uint //
-
GoLang中Json Tag用法实例总结
目录 前言 Json中Tag用法汇总 官方 Marshal 函数说明 参考 总结 前言 GoLang中结构体的 JSON Tag 标识(英文名backquote或backtick,反引号 ` 符号包裹的部分内容)一直未明确看过完整规范和使用说明,存在模棱两可,系统整理如下: JSON Tag标签的完整语法,包含哪些选项 不同选项(输出名/-/omitempty/string)的作用及使用范围 特殊注意事项补充 Json中Tag用法汇总 JSON Tag标签格式为:json:"FieldName/
-
示例剖析golang中的CSP并发模型
目录 1. 相关概念: 2. CSP (通信顺序进程) 3. channel:同步&传递消息 4. goroutine:实际并发执行的实体 5. golang调度器 1. 相关概念: 用户态:当一个进程在执行用户自己的代码时处于用户运行态(用户态) 内核态:当一个进程因为系统调用陷入内核代码中执行时处于内核运行态(内核态),引入内核态防止用户态的程序随意的操作内核地址空间,具有一定的安全保护作用.这种保护模式是通过内存页表操作等机制,保证进程间的地址空间不会相互冲突,一个进程的操作不会修改另一个
随机推荐
- Angular表格神器ui-grid应用详解
- Access使用宏控制程序--1.5.一个宏的实例——检验口令
- KnockoutJS 3.X API 第四章之数据控制流component绑定
- 基于PHP字符串的比较函数strcmp()与strcasecmp()的使用详解
- Android编程获取手机屏幕分辨率大小的方法
- 文章内容页广告浮于左上角的解决办法
- Java中HttpServletResponse响应中文出现乱码问题
- jquery实现点击弹出带标题栏的弹出层(从右上角飞入)效果
- Java使用组件编写窗口实现网上文件下载
- jQuery实现Twitter的自动文字补齐特效
- jquery选择器之基本过滤选择器详解
- jquery子元素过滤选择器使用示例
- JS自动适应的图片弹窗实例
- Apache日志管理和统计分析知识
- Django REST为文件属性输出完整URL的方法
- Python3.5文件修改操作实例分析
- ios设备使用iframe宽度超出屏幕的解决方法
- Visual Studio Code (vscode) 配置 C / C++ 环境的流程
- Vue props用法详解(小结)
- Flutter实现底部导航栏