func ContainsRecursive(v1, v2 interface{}) bool {
	if reflect.DeepEqual(v1, v2) {
		return true
	}

	t1 := reflect.TypeOf(v1)
	if t1 == nil || t1.Kind() != reflect.Map || t1.Key().Kind() != reflect.String {
		return false
	}
	t2 := reflect.TypeOf(v2)
	if t2 == nil || t2.Kind() != reflect.Map || t2.Key().Kind() != reflect.String {
		return false
	}

	vv1, vv2 := reflect.ValueOf(v1), reflect.ValueOf(v2)
	for _, key := range vv2.MapKeys() {
		val1, val2 := vv1.MapIndex(key), vv2.MapIndex(key)
		if !val1.IsValid() {
			return false
		}
		if !ContainsRecursive(val1.Interface(), val2.Interface()) {
			return false
		}
	}
	return true
}
// only concerns string keyed map sub-structure
// - slices, pointers, structs, etc are compared via deepEqual
only concerns string keyed map sub-structure
- slices, pointers, structs, etc are compared via deepEqual
// only concerns string keyed map sub - structure // - slices pointers structs etc are compared via deepEqual
func ContainsRecursive(v1, v2 interface{}) bool {
	if reflect.DeepEqual(v1, v2) {
		return true
	}
	t1 := reflect.TypeOf(v1)
	if t1 == nil || t1.Kind() != reflect.Map || t1.Key().Kind() != reflect.String {
		return false
	}
	t2 := reflect.TypeOf(v2)
	if t2 == nil || t2.Kind() != reflect.Map || t2.Key().Kind() != reflect.String {
		return false
	}
	vv1, vv2 := reflect.ValueOf(v1), reflect.ValueOf(v2)
	for _, key := range vv2.MapKeys() {
		val1, val2 := vv1.MapIndex(key), vv2.MapIndex(key)
		if !val1.IsValid() {
			return false
		}
		if !ContainsRecursive(val1.Interface(), val2.Interface()) {
			return false
		}
	}
	return true
}
func ContainsRecursive ( v1 , v2 interface { } ) bool { if reflect . DeepEqual ( v1 , v2 ) { return true } t1 := reflect . TypeOf ( v1 ) if t1 == nil || t1 . Kind ( ) != reflect . Map || t1 . Key ( ) . Kind ( ) != reflect . String { return false } t2 := reflect . TypeOf ( v2 ) if t2 == nil || t2 . Kind ( ) != reflect . Map || t2 . Key ( ) . Kind ( ) != reflect . String { return false } vv1 , vv2 := reflect . ValueOf ( v1 ) , reflect . ValueOf ( v2 ) for _ , key := range vv2 . MapKeys ( ) { val1 , val2 := vv1 . MapIndex ( key ) , vv2 . MapIndex ( key ) if ! val1 . IsValid ( ) { return false } if ! ContainsRecursive ( val1 . Interface ( ) , val2 . Interface ( ) ) { return false } } return true }
only concerns string keyed map sub-structure
 slices, pointers, structs, etc are compared via deepEqual
only concerns string keyed map sub - structure slices pointers structs etc are compared via deepEqual