web-dev-qa-db-ja.com

Goマップのキーとしての構造体

私は構造体をgolangマップのキーとして使用することを検討していました。この構造体のフィールドもマップであることが想定されており、これは提供されたドキュメントに反するようです here これは、==および!=と比較できるフィールドを持つ構造体のみがフィールドに存在できることを示していますマップでキーとして使用される構造体の。しかし、私は次のことを試してみました:

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

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

20
cobie

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

30
andybalholm

キーとして使用できるのは、比較可能なタイプのみです(==、!=)。構造体(ポインタではない)は、比較可能な型のみが含まれている場合は比較可能です。

0
15412s