最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Golang 實(shí)現(xiàn)獲取當(dāng)前函數(shù)名稱和文件行號等操作

 更新時(shí)間:2021年05月08日 15:08:52   作者:私念  
這篇文章主要介紹了Golang 實(shí)現(xiàn)獲取當(dāng)前函數(shù)名稱和文件行號等操作,具有很好的參考價(jià)值,希望對大家有所幫助。一起跟隨小編過來看看吧

大家還是直接看代碼吧~

// 獲取正在運(yùn)行的函數(shù)名
func runFuncName()string{
    pc := make([]uintptr,1)
    runtime.Callers(2,pc)
    f := runtime.FuncForPC(pc[0])
    return f.Name()
}
package main 
import(
    "fmt"
    "runtime"
)
 
// 獲取正在運(yùn)行的函數(shù)名
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("打印運(yùn)行中的函數(shù)名")
    test1()
    test2()
}

golang 的runtime庫,提供Caller函數(shù),可以返回運(yùn)行時(shí)正在執(zhí)行的文件名和行號:

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.

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

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

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

runtime.Caller()返回函數(shù)執(zhí)行程序計(jì)數(shù)pc、執(zhí)行的文件名和所在行數(shù)

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

文件結(jié)構(gòu)

- 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)
}

當(dāng)在main.go文件中調(diào)用f2時(shí)

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調(diào)取f1,f1調(diào)取getLocation;f2->f1->getLocation經(jīng)歷了三層調(diào)用,所以在f2中傳入3時(shí),返回的當(dāng)前該函數(shù)的執(zhí)行位置及所在函數(shù)名、所在文件名

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

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

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

以上為個(gè)人經(jīng)驗(yàn),希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教。

相關(guān)文章

最新評論

海阳市| 临邑县| 景洪市| 常山县| 礼泉县| 利津县| 布尔津县| 芷江| 江西省| 博爱县| 安泽县| 明水县| 双流县| 乌苏市| 纳雍县| 铜鼓县| 称多县| 垫江县| 新安县| 铅山县| 红河县| 三亚市| 盈江县| 玛沁县| 义马市| 垫江县| 武穴市| 望江县| 富裕县| 阿勒泰市| 涞水县| 东至县| 怀安县| 新宁县| 赣州市| 壤塘县| 静安区| 宣威市| 法库县| 慈利县| 仙居县|