中文字幕av专区_日韩电影在线播放_精品国产精品久久一区免费式_av在线免费观看网站

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

怎么在Golang中獲取當前函數名稱

發布時間:2021-05-08 16:48:23 來源:億速云 閱讀:1626 作者:Leah 欄目:開發技術

這篇文章將為大家詳細講解有關怎么在Golang中獲取當前函數名稱,文章內容質量較高,因此小編分享給大家做個參考,希望大家閱讀完這篇文章后對相關知識有一定的了解。

什么是golang

golang 是Google開發的一種靜態強類型、編譯型、并發型,并具有垃圾回收功能的編程語言,其語法與 C語言相近,但并不包括如枚舉、異常處理、繼承、泛型、斷言、虛函數等功能。

大家還是直接看代碼吧~

// 獲取正在運行的函數名
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函數所在函數名、文件位置、文件名

關于怎么在Golang中獲取當前函數名稱就分享到這里了,希望以上內容可以對大家有一定的幫助,可以學到更多知識。如果覺得文章不錯,可以把它分享出去讓更多的人看到。

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

红桥区| 醴陵市| 莎车县| 邵阳市| 花莲县| 朝阳区| 收藏| 扎囊县| 乐山市| 桐柏县| 龙泉市| 竹北市| 偃师市| 双流县| 西乌| 额济纳旗| 宁远县| 施秉县| 马关县| 巴里| 睢宁县| 邳州市| 南木林县| 西昌市| 香格里拉县| 金山区| 晋城| 太保市| 莎车县| 五峰| 得荣县| 宁陕县| 浠水县| 新乐市| 筠连县| 江都市| 怀柔区| 高要市| 泾源县| 汤原县| 綦江县|