91超碰碰碰碰久久久久久综合_超碰av人澡人澡人澡人澡人掠_国产黄大片在线观看画质优化_txt小说免费全本

溫馨提示×

溫馨提示×

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

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

怎么在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

兰西县| 多伦县| 井陉县| 双城市| 和林格尔县| 泰来县| 亚东县| 平原县| 沙田区| 云霄县| 瑞丽市| 桐庐县| 威信县| 怀仁县| 余干县| 固原市| 台南县| 五原县| 利津县| 新田县| 全州县| 钟山县| 钦州市| 马山县| 滨州市| 高邮市| 葫芦岛市| 通化市| 牡丹江市| 阿坝| 兰州市| 酉阳| 广饶县| 白沙| 武夷山市| 繁昌县| 临汾市| 县级市| 阜南县| 康定县| 元江|