cmp/compare.go
func (rc *recChecker) Check(p Path) {
	const minLen = 1 << 16
	if rc.next == 0 {
		rc.next = minLen
	}
	if len(p) < rc.next {
		return
	}
	rc.next <<= 1

	// Check whether the same transformer has appeared at least twice.
	var ss []string
	m := map[Option]int{}
	for _, ps := range p {
		if t, ok := ps.(Transform); ok {
			t := t.Option()
			if m[t] == 1 { // Transformer was used exactly once before
				tf := t.(*transformer).fnc.Type()
				ss = append(ss, fmt.Sprintf("%v: %v => %v", t, tf.In(0), tf.Out(0)))
			}
			m[t]++
		}
	}
	if len(ss) > 0 {
		const warning = "recursive set of Transformers detected"
		const help = "consider using cmpopts.AcyclicTransformer"
		set := strings.Join(ss, "\n\t")
		panic(fmt.Sprintf("%s:\n\t%s\n%s", warning, set, help))
	}
}
func (rc *recChecker) Check(p Path) {
	const minLen = 1 << 16
	if rc.next == 0 {
		rc.next = minLen
	}
	if len(p) < rc.next {
		return
	}
	rc.next <<= 1

	// Check whether the same transformer has appeared at least twice.
	var ss []string
	m := map[Option]int{}
	for _, ps := range p {
		if t, ok := ps.(Transform); ok {
			t := t.Option()
			if m[t] == 1 { // Transformer was used exactly once before
				tf := t.(*transformer).fnc.Type()
				ss = append(ss, fmt.Sprintf("%v: %v => %v", t, tf.In(0), tf.Out(0)))
			}
			m[t]++
		}
	}
	if len(ss) > 0 {
		const warning = "recursive set of Transformers detected"
		const help = "consider using cmpopts.AcyclicTransformer"
		set := strings.Join(ss, "\n\t")
		panic(fmt.Sprintf("%s:\n\t%s\n%s", warning, set, help))
	}
}
func ( rc * recChecker ) Check ( p Path ) { const minLen = 1 << 16 if rc . next == 0 { rc . next = minLen } if len ( p ) < rc . next { return } rc . next <<= 1 // Check whether the same transformer has appeared at least twice. var ss [ ] string m := map [ Option ] int { } for _ , ps := range p { if t , ok := ps . ( Transform ) ; ok { t := t . Option ( ) if m [ t ] == 1 { // Transformer was used exactly once before tf := t . ( * transformer ) . fnc . Type ( ) ss = append ( ss , fmt . Sprintf ( " " , t , tf . In ( 0 ) , tf . Out ( 0 ) ) ) } m [ t ] ++ } } if len ( ss ) > 0 { const warning = " " const help = " " set := strings . Join ( ss , " \n \t " ) panic ( fmt . Sprintf ( " \n \t \n " , warning , set , help ) ) } }
// Check scans the Path for any recursive transformers and panics when any
// recursive transformers are detected. Note that the presence of a
// recursive Transformer does not necessarily imply an infinite cycle.
// As such, this check only activates after some minimal number of path steps.
Check scans the Path for any recursive transformers and panics when any recursive transformers are detected . Note that the presence of a recursive Transformer does not necessarily imply an infinite cycle . As such this check only activates after some minimal number of path steps .