1. 程式人生 > >Go學習筆記--go指標:unsafe.Pointer

Go學習筆記--go指標:unsafe.Pointer

Go語言是個強型別語言。也就是說Go對型別要求嚴格,不同型別不能進行賦值操作。指標也是具有明確型別的物件,進行嚴格型別檢查。下面的程式碼會產生編譯錯誤 :

package main
import (
    "fmt"
)
func main() {
    u := uint32(32)
    i := int32(1)
    fmt.Println(&u, &i) // 打印出地址
    p := &i // p 的型別是 *int32
    p = &u // &u的型別是 *uint32,於 p 的型別不同,不能賦值    
    p = (*int32)(&u) // 這種型別轉換語法也是無效的  
    fmt.Println(p)
}

unsafe 包提供的Pointer方法可以完成這個任務

package main
import (
    "fmt"
    "unsafe"
)
func main() {
    u := uint32(32)
    i := int32(1)
    fmt.Println(&u, &i)
    p := &i
    p = (*int32)(unsafe.Pointer(&u))
    fmt.Println(p)
}

注意:實際使用中unsafe可用場景很少,稍微複雜一點的結構,比如struct,unsafe根本不能適用