您好,登錄后才能下訂單哦!
golang的堆棧是什么?怎么用?這些問題可能是我們?nèi)粘9ぷ鲿姷降?。通過這些問題,希望你能收獲更多。下面是揭開這些問題的詳細內(nèi)容。
數(shù)據(jù)結(jié)構(gòu)的堆棧:
堆:堆可以被看成是一棵樹,如:堆排序。在隊列中,調(diào)度程序反復(fù)提取隊列中第一個作業(yè)并運行,因為實際情況中某些時間較短的任務(wù)將等待很長時間才能結(jié)束,或者某些不短小,但具有重要性的作業(yè),同樣應(yīng)當具有優(yōu)先權(quán)。
堆即為解決此類問題設(shè)計的一種數(shù)據(jù)結(jié)構(gòu)。
棧:一種先進后出的數(shù)據(jù)結(jié)構(gòu)。
堆棧緩存方式
棧使用的是一級緩存, 他們通常都是被調(diào)用時處于存儲空間中,調(diào)用完畢立即釋放。
堆則是存放在二級緩存中,生命周期由虛擬機的垃圾回收算法來決定(并不是一旦成為孤兒對象就能被回收)。所以調(diào)用這些對象的速度要相對來得低一些。
堆棧跟蹤
下面討論堆棧跟蹤信息以及如何在堆棧中識別函數(shù)所傳遞的參數(shù)。
以下測試案例的版本是Go 1.11
示例:
package main import "runtime/debug" func main() { slice := make([]string, 2, 4) Example(slice, "hello", 10) } func Example(slice []string, str string, i int) { debug.PrintStack() }
列表1是一個簡單的程序, main函數(shù)在第5行調(diào)用Example函數(shù)。Example函數(shù)在第9行聲明,它有三個參數(shù),一個字符串slice,一個字符串和一個整數(shù)。它的方法體也很簡單,只有一行,debug.PrintStack(),這會立即產(chǎn)生一個堆棧跟蹤信息:
goroutine 1 [running]: runtime/debug.Stack(0x1, 0x0, 0x0) C:/Go/src/runtime/debug/stack.go:24 +0xae runtime/debug.PrintStack() C:/Go/src/runtime/debug/stack.go:16 +0x29 main.Example(0xc000077f48, 0x2, 0x4, 0x4abd9e, 0x5, 0xa) D:/gopath/src/example/example/main.go:10 +0x27 main.main() D:/gopath/src/example/example/main.go:7 +0x79
堆棧跟蹤信息:
第一行顯示運行的goroutine是id為 1的goroutine。
第二行 debug.Stack()被調(diào)用
第四行 debug.PrintStack() 被調(diào)用
第六行 調(diào)用debug.PrintStack()的代碼位置,位于main package下的Example函數(shù)。它也顯示了代碼所在的文件和路徑,以及debug.PrintStack()發(fā)生的行數(shù)(第10行)。
第八行 也調(diào)用Example的函數(shù)的名字,它是main package的main函數(shù)。它也顯示了文件名和路徑,以及調(diào)用Example函數(shù)的行數(shù)。
關(guān)于golang的堆棧介紹就分享到這里了,希望以上內(nèi)容可以對大家有一定的幫助,可以學(xué)到更多知識。如果覺得文章不錯,可以把它分享出去讓更多的人看到。
免責聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進行舉報,并提供相關(guān)證據(jù),一經(jīng)查實,將立刻刪除涉嫌侵權(quán)內(nèi)容。