type visit … // Tests for deep equality using reflected types. The map argument tracks // comparisons that have already been seen, which allows short circuiting on // recursive types. func deepValueEqual(v1, v2 Value, visited map[visit]bool) bool { … } // DeepEqual reports whether x and y are “deeply equal,” defined as follows. // Two values of identical type are deeply equal if one of the following cases applies. // Values of distinct types are never deeply equal. // // Array values are deeply equal when their corresponding elements are deeply equal. // // Struct values are deeply equal if their corresponding fields, // both exported and unexported, are deeply equal. // // Func values are deeply equal if both are nil; otherwise they are not deeply equal. // // Interface values are deeply equal if they hold deeply equal concrete values. // // Map values are deeply equal when all of the following are true: // they are both nil or both non-nil, they have the same length, // and either they are the same map object or their corresponding keys // (matched using Go equality) map to deeply equal values. // // Pointer values are deeply equal if they are equal using Go's == operator // or if they point to deeply equal values. // // Slice values are deeply equal when all of the following are true: // they are both nil or both non-nil, they have the same length, // and either they point to the same initial entry of the same underlying array // (that is, &x[0] == &y[0]) or their corresponding elements (up to length) are deeply equal. // Note that a non-nil empty slice and a nil slice (for example, []byte{} and []byte(nil)) // are not deeply equal. // // Other values - numbers, bools, strings, and channels - are deeply equal // if they are equal using Go's == operator. // // In general DeepEqual is a recursive relaxation of Go's == operator. // However, this idea is impossible to implement without some inconsistency. // Specifically, it is possible for a value to be unequal to itself, // either because it is of func type (uncomparable in general) // or because it is a floating-point NaN value (not equal to itself in floating-point comparison), // or because it is an array, struct, or interface containing // such a value. // On the other hand, pointer values are always equal to themselves, // even if they point at or contain such problematic values, // because they compare equal using Go's == operator, and that // is a sufficient condition to be deeply equal, regardless of content. // DeepEqual has been defined so that the same short-cut applies // to slices and maps: if x and y are the same slice or the same map, // they are deeply equal regardless of content. // // As DeepEqual traverses the data values it may find a cycle. The // second and subsequent times that DeepEqual compares two pointer // values that have been compared before, it treats the values as // equal rather than examining the values to which they point. // This ensures that DeepEqual terminates. func DeepEqual(x, y any) bool { … }