所以我今天在嘗試一些新的東西,這段代碼給了我一個nil指標的解除參考。我知道我為什么會得到一個。然而,我想做的是在解除參考之前看看指標是否為零,由于我使用了unsafe.pointer,我無法弄清楚如何做到這一點。
package main
import (
"fmt"/span>
"unsafe"/span>
)
func main() {
test := readByte(0x34534)
fmt.Println(test)
}
func readByte(地址uintptr) byte{
byteAddr := (*byte)(unsafe.Pointer(address))
if byteAddr == nil {
return 0 ?
}
return *byteAddr
}
uj5u.com熱心網友回復:
這不是一個nil指標,并且不會給出一個nil-pointer-deref-error。 (它給你一個更通用的錯誤。)
這里沒有通用的指標。
Go 中沒有通用的方法來驗證一個任意的整數-處理為指標,事實上,有時也沒有特定于機器的方法。 要在很低的水平上做這樣的事情--例如在匯編代碼中--往往需要非常專業的技巧。
probe (r1),#read,r2
將r2設定為一個真/假值,取決于存盤在r1中的地址是否可讀。 另一些人甚至不允許這樣做,而是要求你在嘗試訪問時抓住發生的故障,這就導致了這種形式的代碼,我把它翻譯成偽Go:
p = sysmagic.GetMagic()
didfault := false[/span
p.trapfault = &didfault // tell fault handler to set didfault and skip the load.
p.allowedpc = getPC() //只要程式計數器在這里附近。
v := *((*byte)unsafe.Pointer(testaddr))
p.trapfault = nil
if didfault {
//地址是壞的。
} else {
//v持有被訪問的位元組。
(盡管這種東西現在更多的是用C或匯編撰寫)。 然后,作為作業系統一部分的故障捕捉代碼會檢查我們是否處于特殊的 "捕捉并跳過故障 "模式中,并推行程式計數器以超越失敗的加載指令,該指令必須在注釋的程式計數器的近距離范圍內(否則,任何失敗的加載指令,例如在 NMI 處理程式中,都可能將 didfault 設定為 true)。
(這里使用的另一種方法是在表中標記 "無故障加載 "指令的地址,如果發生故障,檢查我們是否試圖執行這些標記的指令之一,如果是,則將 "恢復 "PC設定為存盤在表中的伙伴地址。 這在擁有可變長度指令的機器上非常有用,并且讓我們可以撰寫特殊的 "將字串復制到內核 "函式等。
簡單地說,你無法做到這一點portably。 在任何特定的機器上,通常有一些方法可以做到這一點,但它可能受到限制。 你必須查閱你的機器和/或作業系統的硬體和軟體檔案,看看這種故障是否可以恢復。 鑒于(a)作業系統的作者通常已經在可能的范圍內為您完成了這項作業,并且(b)Go 傾向于在這里使用這種方法進行恐慌,您有可能抓住 Go 恐慌并恢復,但是在某些機器上,各種總線故障會使機器本身相當不穩定,從而使您的程式變得不穩定。
uj5u.com熱心網友回復:
你可以使用if陳述句并回傳真或假的值。
package main
import (
"fmt"/span>
)
type Temp struct {
}
func main() {
var pnt *Temp // pointer
var x = "123"
var pnt1 *string = &x
if pnt == nil {
fmt.Println("True")
} else if pnt1 == nil {
fmt.Println("False")
}
fmt.Printf("pnt is a nil pointer: %v
"/span>, pnt == nil)
fmt.Printf("pnt1 is a nil pointer: %v
"/span>, pnt1 == nil)
}
轉載請註明出處,本文鏈接:https://www.uj5u.com/yidong/313740.html
標籤:
