2011-05-31 76 views
3

我想創建一個地圖的地圖,我創建的時間與它分配。關鍵是撥打電話new()返回的地址。我如何獲得new()返回的地址?如何存儲指針指向的地址?

type T struct{a, b int } 

func main(){ 

     var t int64 = time.Nanoseconds() 
     memmap := make(map[uint8]int64) 
     fmt.Printf("%d\n", t) 
     var ptr *T = new(T) 
     ptr.a = 1 
     ptr.b = 2 
     fmt.Printf("%d %d %p %T\n", ptr.a, ptr.b, ptr, ptr) 
     //memmap[ptr] = t //gives error 
     //var temp uint8 = ptr//gives error 
} 

請告訴我應該是什麼鍵字段的類型,在地圖中,這樣我可以存儲new()返回的地址?我計劃使用new()不同的類型,獲取分配的地址並將其與創建時間進行映射。

回答

6

您可以使用unsafe包中的Pointer類型,但是包名稱暗示它是不安全的。地址本身是一個不透明的東西,實際上僅僅爲地圖使用地址值的用處不大,最好使用類型和地址的元組。這就是unsafe.Reflect提供給你的。包reflect爲您提供功能UnsafeAddr和更多。

我建議您閱讀包裝文檔reflectunsafe包。

+0

謝謝。我會嘗試相同的。 – spl 2011-05-31 07:07:17

2

使用uintptr,一個足夠大的無符號整數來存儲指針值的未解釋位作爲內存映射密鑰類型。

例如,

package main 

import (
    "fmt" 
    "time" 
    "unsafe" 
) 

type T struct{ a, b int } 

func main() { 
    memmap := make(map[uintptr]int64) 

    pT := new(T) 
    memmap[uintptr(unsafe.Pointer(pT))] = time.Nanoseconds() 
    pT.a = 1 
    pT.b = 2 
    fmt.Printf("%d %d %p %T\n", pT.a, pT.b, pT, pT) 

    pI := new(int) 
    memmap[uintptr(unsafe.Pointer(pI))] = time.Nanoseconds() 
    *pI = 42 
    fmt.Printf("%d %p %T\n", *pI, pI, pI) 

    fmt.Printf("\n%T\n", memmap) 
    for k, v := range memmap { 
     fmt.Printf("%x: %d\n", k, v) 
    } 
} 

輸出:

1 2 0xf8400001f8 *main.T 
42 0xf8400001f0 *int 

map[uintptr] int64 
f8400001f0: 1306837191421330000 
f8400001f8: 1306837191421293000 
+0

感謝您的詳細代碼。 :) – spl 2011-06-02 04:41:50

相關問題