2016-11-13 92 views
-2

指針引用內存中的位置。據我瞭解,實際上所有的內存地址都是獨立於變量類型的。不同類型的指針有什麼區別?

而不是使用不同的指針類型(*int,*string等..),這是可能的只有一種類型(var p pointer)的所有指針類型?

不同的指針類型有什麼區別?

package main 

import "fmt" 

func main() { 
    i := 5 
    s := "abc" 

    var pi *int  // alternatively var pi pointer 
    var ps *string // alternatively var ps pointer 

    pi = &i 
    ps = &s 

    fmt.Printf("%p %p", pi, ps) // result is 0x1040e0f8 0x1040a120 
} 

回答

2

Go中的類型系統旨在防止與指針相關的內存錯誤。這允許程序員有足夠的控制來操作內存中的對象,同時允許垃圾回收器頂級警察喜歡繁重的工作。
如果您需要手動記憶並轉換指針類型,則可以使用unsafe package

+0

謝謝你的回覆。但由於缺乏信息,這種解釋對我來說很遙遠。指針指向的是32位或64位int表示的內存。它是否正確 ?。如果這個信息是正確的,爲什麼我們使用與變量類型相關的不同指針類型?如果這個信息不正確,不同的指針類型有什麼區別? –

+2

@AliAltun首先,一個關鍵點是,如果所有的指針都是相同的,那麼你會丟失類型信息,並且使語言效率低下並且不太安全。你不希望接受'* int'的函數接受'* float',否則你失去了靜態類型語言的一個關鍵優勢。 –

0

這是可能的只使用一種類型的所有指針類型?

是的,這幾乎是C的工作原理。不幸的是,這使得語言變得危險。假設你有一個10字節的數組。如果您只是傳遞指針,其他代碼將不知道可以安全訪問多少個字節。這會導致各種緩衝區溢出錯誤。 (即HeartBleed)

在Go中,它們的指針知道它所指向的事物的類型,所以它可以防止您的代碼始終存在緩衝區溢出問題。

你可以做你想做的事,但只能使用不安全的軟件包。顧名思義,這是一件非常危險的事情。

也許如果你發佈了你真正想做的事,人們可以幫助你。使用不安全的指針不是編寫高性能代碼的唯一方法。

相關問題