アドレスが異なるポインタが等しいか確かめる方法
Golangでポインタ型を使用していると、異なるポインタ型変数の値が等しいかどうかを確かめたい時があると思います。
ですが、ポインタ型はアドレスを返すので、変数毎にアドレス番号が変わり、比較するのが難しいです。
そこで使うのが、reflectパッケージです。
GolangのreflectパッケージのDeepEqual関数を使用すると、異なるアドレスを持つポインタ型の値を比較して、値が等しいかどうかを確かめることができます。
reflect.DeepEqual(ポインタ1, ポインタ2)
reflect.DeepEqualを使用したポインタの等価確認
reflect.DeepEqualを使用して、2つのポインタ型の値が同じであるかどうかを確かめるコード例を紹介します。
package main
import (
"fmt"
"reflect"
)
func main() {
toInt32Ptr := func(num int) *int { return &num }
var p1 *int = toInt32Ptr(10)
var p2 *int = toInt32Ptr(10)
fmt.Println(p1 == p2) // false(イコールだとアドレス番号で比較する)
fmt.Println(reflect.DeepEqual(p1, p2)) // true
}
reflect.DeepEqualの場合、ポインタ型の値をデリファレンスした後の値で比較していることと同じになります。