func DeepEqual(a, b interface{}) bool {
	ra := reflect.Indirect(reflect.ValueOf(a))
	rb := reflect.Indirect(reflect.ValueOf(b))
	if raValid, rbValid := ra.IsValid(), rb.IsValid(); !raValid && !rbValid {
		return reflect.TypeOf(a) == reflect.TypeOf(b)
	} else if raValid != rbValid {
		return false
	}
	return reflect.DeepEqual(ra.Interface(), rb.Interface())
}
DeepEqual returns if the two values are deeply equal like reflect.DeepEqual.
In addition to this, this method will also dereference the input values if
possible so the DeepEqual performed will not fail if one parameter is a
pointer and the other is not.

DeepEqual will not perform indirection of nested values of the input parameters.
package awsutil
import (
	"reflect"
)