2
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

Goで違うmapであることをテストする

Posted at

Goにおけるmapは実体ではなく参照として扱われる。
故に、代入によっては実体はコピーされず参照だけがコピーされる。
よって、mapを複製する際は新しいmapを作ってそこに内容をコピーする必要がある。

しかし、これを素直にテストしようとすると困ったことになる。
というのも、 invalid operation: m2 == m1 (map can only be compared to nil) と怒られてしまうのだ。

package main

func main() {
	m1 := map[int]int{}
	m2 := m1
	if m2 == m1 {
		println("m2 is same as m1")
	} else {
		println("m2 is different by m1")
	}

	m2 = map[int]int{}
	if m2 == m1 {
		println("m2 is same as m1")
	} else {
		println("m2 is different by m1")
	}
}

これでは困ってしまう。
reflect.ValueOf から Value.Pointer を呼び出すことでポインタを得ることができるのでこれを比較することで解決できそうだ。
https://golang.org/pkg/reflect/#Value.Pointer

package main

import (
	"reflect"
)

func main() {
	m1 := map[int]int{}
	m2 := m1
	if reflect.ValueOf(m2).Pointer() == reflect.ValueOf(m1).Pointer() {
		println("m2 is same as m1")
	} else {
		println("m2 is different by m1")
	}

	m2 = map[int]int{}
	if reflect.ValueOf(m2).Pointer() == reflect.ValueOf(m1).Pointer() {
		println("m2 is same as m1")
	} else {
		println("m2 is different by m1")
	}
}

動いた!
もうちょっと良い方法ないもんかなー。

2
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
2
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?