2014-09-20 70 views
1

我試圖創建元素的映射。我想用一個指針而不是一個整數作爲關鍵。問題是...我一直得到相同的指針。不管我創造了多少次。爲什麼是這樣?如何獲得真正的指針,如果可能的話,不使用不安全的軟件包。Go結構指針不唯一

package main 

import (
    "fmt" 
) 

type Thingy struct{} 

var things map[*Thingy]int 

func main() { 
    things = make(map[*Thingy]int) 

    thing1 := new(Thingy) 
    tracePointer("thing1", thing1) 
    things[thing1] = 1 

    thing2 := new(Thingy) 
    tracePointer("thing2", thing2) 
    things[thing2] = 2 

    thing3 := &Thingy{} 
    tracePointer("thing3", thing3) 
    things[thing3] = 3 

    fmt.Printf("Amount of things: %d\n", len(things)) 
} 

func tracePointer(identifier string, obj interface{}) { 
    fmt.Printf("%s pointer: %p\n", identifier, obj) 
} 

輸出繼電器:

thing1 pointer: 0x546570 
thing2 pointer: 0x546570 
thing3 pointer: 0x546570 
Amount of things: 1 

回答

2

struct{}是一個特例,它總是使用0字節的內存,將始終有相同的地址。

如果你只是想要一個虛擬指針,你可以使用type Thingy byte

thing1 pointer: 0x10328000 
thing2 pointer: 0x10328020 
thing3 pointer: 0x10328021 
Amount of things: 3 

playground

//編輯

由於James Henstridge的意見,struct{}的,如果他們是更大的結構內部地址變更指出。

http://play.golang.org/p/51_PhqDNhk

+0

指針空'結構{}'變量並不總是有相同的地址:如果他們是更大的數據結構的一部分,而不是獨立分配,他們的地址將是結構中的某處點。例如。 http://play.golang.org/p/51_PhqDNhk – 2014-09-22 05:31:57