自分のタイプ(この場合はPoint)のセットとして組み込みマップタイプを使用しようとしています。問題は、ポイントをマップに割り当て、後に新しいポイントを作成してキーとして使用すると、そのキーがマップにないかのようにマップが動作することです。これはできないのですか?Go - ユーザー定義型で設定したプロパティのマップを使用する
// maptest.go
package main
import "fmt"
func main() {
set := make(map[*Point]bool)
printSet(set)
set[NewPoint(0, 0)] = true
printSet(set)
set[NewPoint(0, 2)] = true
printSet(set)
_, ok := set[NewPoint(3, 3)] // not in map
if !ok {
fmt.Print("correct error code for non existent element\n")
} else {
fmt.Print("incorrect error code for non existent element\n")
}
c, ok := set[NewPoint(0, 2)] // another one just like it already in map
if ok {
fmt.Print("correct error code for existent element\n") // should get this
} else {
fmt.Print("incorrect error code for existent element\n") // get this
}
fmt.Printf("c: %t\n", c)
}
func printSet(stuff map[*Point]bool) {
fmt.Print("Set:\n")
for k, v := range stuff {
fmt.Printf("%s: %t\n", k, v)
}
}
type Point struct {
row int
col int
}
func NewPoint(r, c int) *Point {
return &Point{r, c}
}
func (p *Point) String() string {
return fmt.Sprintf("{%d, %d}", p.row, p.col)
}
func (p *Point) Eq(o *Point) bool {
return p.row == o.row && p.col == o.col
}
代わりに 'map [int] map [int] Point'があります。メモリ消費量とアクセス時間が増加しましたが、アイテムを見つけやすくなりました。 –
まさに私が言うつもりだった。 – crazy2be
はい。 'map [int] map [int] Point'とPointの特定のインスタンスへのポインタではなく、Point座標の値に依存するマップキーの他のスキームも機能します。 – peterSO