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

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

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

大家還是直接看代碼吧~

// 獲取正在運行的函數(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"
)
 
// 獲取正在運行的函數(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("打印運行中的函數(shù)名")
    test1()
    test2()
}

golang 的runtime庫,提供Caller函數(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為行號。有了這個就可以在自己的日志等函數(shù)中添加這個記錄了。

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

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

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

runtime.FuncForPC()傳入pc,得到運行的函數(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時

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時,返回的當(dāng)前該函數(shù)的執(zhí)行位置及所在函數(shù)名、所在文件名

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

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

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

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

相關(guān)文章

  • 淺析Go使用定時器時如何避免潛在的內(nèi)存泄漏陷阱

    淺析Go使用定時器時如何避免潛在的內(nèi)存泄漏陷阱

    這篇文章來和大家一起探討一下Go?中如何高效使用?timer,特別是與select?一起使用時,如何防止?jié)撛诘膬?nèi)存泄漏問題,感興趣的可以了解下
    2024-01-01
  • Go語言命令行操作命令詳細介紹

    Go語言命令行操作命令詳細介紹

    這篇文章主要介紹了Go語言命令行操作命令詳細介紹,本文重點介紹了go build、go clean、go fmt、go get等命令,需要的朋友可以參考下
    2014-10-10
  • golang?gorm的關(guān)系關(guān)聯(lián)實現(xiàn)示例

    golang?gorm的關(guān)系關(guān)聯(lián)實現(xiàn)示例

    這篇文章主要為大家介紹了golang?gorm的關(guān)系關(guān)聯(lián)實現(xiàn)示例,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步早日升職加薪
    2022-04-04
  • Golang中omitempty關(guān)鍵字的具體實現(xiàn)

    Golang中omitempty關(guān)鍵字的具體實現(xiàn)

    本文主要介紹了Golang中omitempty關(guān)鍵字的具體實現(xiàn),文中通過示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2022-01-01
  • Go?http.Transport?主要參數(shù)說明

    Go?http.Transport?主要參數(shù)說明

    這篇文章主要為大家介紹了Go?http.Transport主要參數(shù)說明,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪
    2023-06-06
  • 詳解如何使用Go語言進行文件監(jiān)控和通知

    詳解如何使用Go語言進行文件監(jiān)控和通知

    在Go語言中,文件監(jiān)控通常涉及到文件系統(tǒng)事件的監(jiān)聽,文件或目錄的狀態(tài)發(fā)生變化(如創(chuàng)建、刪除、修改等)時,你的程序需要得到通知,所以本文給大家介紹了如何使用Go語言進行文件監(jiān)控和通知,需要的朋友可以參考下
    2024-06-06
  • 使用Go語言實現(xiàn)配置文件熱加載功能

    使用Go語言實現(xiàn)配置文件熱加載功能

    這篇文章主要介紹了使用Go語言實現(xiàn)配置文件熱加載功能,以及配置文件熱加載包的實現(xiàn)思路,需要的朋友可以參考下
    2018-03-03
  • golang API開發(fā)過程的中的自動重啟方式(基于gin框架)

    golang API開發(fā)過程的中的自動重啟方式(基于gin框架)

    這篇文章主要介紹了golang API開發(fā)過程的中的自動重啟方式(基于gin框架),本文給大家介紹的非常詳細,對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2020-12-12
  • 在Golang中使用C語言代碼實例

    在Golang中使用C語言代碼實例

    這篇文章主要介紹了在Golang中使用C語言代碼實例,本文先是給出了一個Hello World例子、Golang 引用 C例子,并總結(jié)了一些要注意的地方,需要的朋友可以參考下
    2014-10-10
  • Golang實現(xiàn)Mongo數(shù)據(jù)庫增刪改查操作

    Golang實現(xiàn)Mongo數(shù)據(jù)庫增刪改查操作

    本文主要介紹了Golang實現(xiàn)Mongo數(shù)據(jù)庫增刪改查操作,我們使用了 MongoDB的官方Go驅(qū)動程序,實現(xiàn)了插入、查詢、更新和刪除操作,感興趣的可以了解一下
    2024-01-01

最新評論

蛟河市| 澎湖县| 蓝田县| 广宗县| 福建省| 娱乐| 鄂温| 无锡市| 山阳县| 赤壁市| 东安县| 弥勒县| 广水市| 池州市| 庆安县| 慈溪市| 阿合奇县| 成安县| 通化市| 砚山县| 新疆| 芮城县| 赞皇县| 铜梁县| 常熟市| 丹凤县| 安阳市| 双辽市| 大邑县| 苏尼特左旗| 九龙坡区| 苏尼特右旗| 岑巩县| 永嘉县| 荔波县| 湘西| 上林县| 青海省| 北海市| 瑞丽市| 绍兴市|