2014-01-11 21 views
14

golangマップで構造体をキーとして使用する方法を検討していました。この構造体のフィールドもマップであると考えられています。hereのドキュメントには、==および!=と比較できるフィールドしかない構造体しかキーとして使用されている構造体地図で。しかし私は、以下しようとする先に行ってきました:構造体をGoマップのキーとして使用する

package main 

import "fmt" 
import "strings" 

func main() { 
    fmt.Println("Hello, 世界") 
    fmt.Println(strings.Join([]string{"obi", "$", "56"}, "")) 
    z := make(map[string]float64) 

    z["obi"] = 0.003 

    x := &test{ 
     name:"testing", 
     code:z, 
    } 

    a := &test{ 
     name:"testing2", 
     code:z, 
    } 

    y := make(map[*test] string) 

    y[x] = "go home" 
    y[a] = "come home" 

    for key, val := range y{ 
     fmt.Println(key.name, key.code, val) 
    } 

} 

type test struct{ 
    name string 
    code map[string]float64 
} 

出力されました:

Hello, 世界 
obi$56 
testing map[obi:0.003] go home 
testing2 map[obi:0.003] come home 

これをキーとして、構造体のフィールドとしてドキュメントに反するように見えるマップです。何が間違っているように見えますか?

答えて

22

例では、マップキーは構造体へのポインタであり、構造体自体ではありません。ポインタが指し示す項目が比較できないときでも、ポインタは等しいかどうか比較することができます。この比較は、項目の内容に基づいて行われるのではなく、そのメモリアドレス上でのみ行われます。

+0

質問、マップのキーをx型のポインターにするのがもっともらしい場合がありますか? – Roylee

+2

もちろん、コンテンツの平等よりもオブジェクトのアイデンティティに興味があるのは確かです。たとえば、Webサーバーにリクエストごとの余分なデータをマップ[* http.Request]の文字列などで格納することができます。 – andybalholm

+0

thats良いこと、ありがとう;) – Roylee

関連する問題