演算子==
と!=
がオプションではない場合、2 つのスライスが等しいかどうかをどのように確認すればよいでしょうか?
package main
import "fmt"
func main() {
s1 := []int{1, 2}
s2 := []int{1, 2}
fmt.Println(s1 == s2)
}
これは以下ではコンパイルされません:
無効な操作: s1 == s2 (スライスは nil とのみ比較できます)
ベストアンサー1
使用すべき反映するDeepEqual()
DeepEqual は、Go の == 演算子の再帰的な緩和です。
DeepEqual は、x と y が次のように定義される「深く等しい」かどうかを報告します。 次のいずれかのケースが当てはまる場合、同じ型の 2 つの値は深く等しいとみなされます。 異なる型の値は深く等しくなることはありません。
配列の値は、対応する要素が深く等しい場合に深く等しくなります。
構造体の値は、対応するフィールド(エクスポートされているフィールドとエクスポートされていないフィールドの両方)が深く等しい場合、深く等しくなります。
両方が nil の場合、Func 値は深く等しくなります。それ以外の場合は深く等しくありません。
インターフェース値は、深く等しい具体的な値を保持している場合、深く等しいとみなされます。
マップ値が深く等しいのは、同じマップ オブジェクトである場合、または長さが同じであり、対応するキー (Go の等価性を使用して一致) が深く等しい値にマップされる場合です。
ポインタ値は、Go の == 演算子を使用して等しい場合、または深く等しい値を指している場合、深く等しいとされます。
スライス値は、以下の条件がすべて満たされる場合に、深く等しくなります。両方とも nil または両方とも nil 以外であり、長さが同じであり、同じ基になる配列の同じ初期エントリを指している (つまり、&x[0] == &y[0]) か、対応する要素 (長さまで) が深く等しくなります。nil 以外の空のスライスと nil スライス (たとえば、[]byte{} と []byte(nil)) は深く等しくないことに注意してください。
その他の値 (数値、ブール値、文字列、チャネル) は、Go の == 演算子を使用して等しい場合は、深く等しいとみなされます。