婷婷综合国产,91蜜桃婷婷狠狠久久综合9色 ,九九九九九精品,国产综合av

主頁 > 知識庫 > Golang 實現獲取當前函數名稱和文件行號等操作

Golang 實現獲取當前函數名稱和文件行號等操作

熱門標簽:壽光微信地圖標注 阿克蘇地圖標注 百度地圖標注后傳給手機 外呼系統顯本地手機號 excel地圖標注分布數據 電話機器人軟件免費 涿州代理外呼系統 評價高的400電話辦理 外呼系統用什么卡

大家還是直接看代碼吧~

// 獲取正在運行的函數名
func runFuncName()string{
    pc := make([]uintptr,1)
    runtime.Callers(2,pc)
    f := runtime.FuncForPC(pc[0])
    return f.Name()
}
package main 
import(
    "fmt"
    "runtime"
)
 
// 獲取正在運行的函數名
func runFuncName()string{
    pc := make([]uintptr,1)
    runtime.Callers(2,pc)
    f := runtime.FuncForPC(pc[0])
    return f.Name()
}
 
func test1(){
    i:=0
    fmt.Println("i =",i)
    fmt.Println("FuncName1 =",runFuncName())
}
 
func test2(){
    i:=1
    fmt.Println("i =",i)
    fmt.Println("FuncName2 =",runFuncName())
}
 
func main(){
    fmt.Println("打印運行中的函數名")
    test1()
    test2()
}

golang 的runtime庫,提供Caller函數,可以返回運行時正在執行的文件名和行號:

func Caller(skip int) (pc uintptr, file string, line int, ok bool) {

Caller reports file and line number information about function invocations on the calling goroutine's stack. The argument skip is the number of stack frames to ascend, with 0 identifying the caller of Caller. (For historical reasons the meaning of skip differs between Caller and Callers.) The return values report the program counter, file name, and line number within the file of the corresponding call. The boolean ok is false if it was not possible to recover the information.

調用方法如下,返回的file為絕對路徑,line為行號。有了這個就可以在自己的日志等函數中添加這個記錄了。

_, file, line, ok := runtime.Caller(1)

補充:go 定位函數操作位置(文件名、函數名、所在行)

runtime.Caller()返回函數執行程序計數pc、執行的文件名和所在行數

runtime.FuncForPC()傳入pc,得到運行的函數指針

文件結構

- runtime
- -file1.go
- -file2.go
- -main.go

main.go文件

package main
import (
	"fmt"
	"path"
	"runtime"
)
func main(){
	name, funcName, line := f2(0)
	fmt.Printf("file:%v;function:%v;line:%d",name,funcName,line)
}
func getLocation(skip int)(fileName ,funcName string ,line int){
	pc, file, line, ok := runtime.Caller(skip)
	if !ok {
		fmt.Println("get info failed")
		return
	}
	fmt.Println(pc,file)
	fileName = path.Base(file)
	funcName = runtime.FuncForPC(pc).Name()
	return
}

file1.go文件

package main
func f1(skip int)(fileName ,funcName string ,line int){
 fileName, funcName, line = getLocation(skip)
 return
}

file2.go文件

package main
func f2(skip int)(fileName ,funcName string ,line int){
 return f1(skip)
}

當在main.go文件中調用f2時

func main(){
 name, funcName, line := f2(3)
 fmt.Printf("file:%v;function:%v;line:%d",name,funcName,line)
 //output:file:main.go;function:main.main;line:10
}

f2調取f1,f1調取getLocation;f2->f1->getLocation經歷了三層調用,所以在f2中傳入3時,返回的當前該函數的執行位置及所在函數名、所在文件名

當傳入2時,返回的是(file:file2.go;function:main.f2;line:8)f2函數所在函數名、文件位置、文件名

當傳入1時,返回的是(file:file1.go;function:main.f1;line:4)f1函數所在函數名、文件位置、文件名

當傳入0時,返回的是(file:main.go;function:main.getLocation;line:16)getLocation函數所在函數名、文件位置、文件名

以上為個人經驗,希望能給大家一個參考,也希望大家多多支持腳本之家。如有錯誤或未考慮完全的地方,望不吝賜教。

您可能感興趣的文章:
  • Go語言的os包中常用函數初步歸納
  • Golang 獲取文件md5校驗的方法以及效率對比
  • GoLang中生成UUID唯一標識的實現
  • 聊聊golang中多個defer的執行順序
  • Golang全局變量加鎖的問題解決
  • go語言基礎 seek光標位置os包的使用

標簽:蘭州 重慶 欽州 雞西 銅川 梅河口 吐魯番 汕頭

巨人網絡通訊聲明:本文標題《Golang 實現獲取當前函數名稱和文件行號等操作》,本文關鍵詞  Golang,實現,獲取,當前,函數,;如發現本文內容存在版權問題,煩請提供相關信息告之我們,我們將及時溝通與處理。本站內容系統采集于網絡,涉及言論、版權與本站無關。
  • 相關文章
  • 下面列出與本文章《Golang 實現獲取當前函數名稱和文件行號等操作》相關的同類信息!
  • 本頁收集關于Golang 實現獲取當前函數名稱和文件行號等操作的相關信息資訊供網民參考!
  • 推薦文章
    主站蜘蛛池模板: 沙洋县| 莆田市| 离岛区| 济宁市| 奎屯市| 太仓市| 太原市| 自贡市| 新河县| 明溪县| 虞城县| 桃源县| 古交市| 四川省| 泗水县| 尤溪县| 盐城市| 门头沟区| 文山县| 台东县| 大渡口区| 大港区| 长兴县| 博爱县| 邓州市| 金门县| 广元市| 平原县| 赤峰市| 平定县| 太保市| 乌鲁木齐市| 沭阳县| 锡林浩特市| 巢湖市| 新宾| 嫩江县| 综艺| 辉南县| 枣阳市| 汝城县|