func isNextSuffixPattern(p []string) bool {
	if len(p) >= 2 && isMatchPattern(p[0]) && !isMatchPattern(p[1]) {
		matcher, _ := parseMatcher(p[0])
		if _, ok := matcher.(*FixedLengthMatcher); ok {
			return false
		}
		r, _ := utf8.DecodeRuneInString(p[1])
		return matcher.MatchRune(r)
	}
	return false
}
func isNextSuffixPattern(p []string) bool {
	if len(p) >= 2 && isMatchPattern(p[0]) && !isMatchPattern(p[1]) {
		matcher, _ := parseMatcher(p[0])
		if _, ok := matcher.(*FixedLengthMatcher); ok {
			return false
		}
		r, _ := utf8.DecodeRuneInString(p[1])
		return matcher.MatchRune(r)
	}
	return false
}
func isNextSuffixPattern ( p [ ] string ) bool { if len ( p ) >= 2 && isMatchPattern ( p [ 0 ] ) && ! isMatchPattern ( p [ 1 ] ) { matcher , _ := parseMatcher ( p [ 0 ] ) if _ , ok := matcher . ( * FixedLengthMatcher ) ; ok { return false } r , _ := utf8 . DecodeRuneInString ( p [ 1 ] ) return matcher . MatchRune ( r ) } return false }
// isNextSuffixPattern see next 2 patterns can be suffix matcher. If following
// two cases are both true, it could possibly become a suffix matcher.
//   1. the first pattern is a Matcher.
//   2. the next pattern is a static pattern.
// If the first matcher can't match the first rune of the second static pattern,
// next pattern should be a suffix matcher combined the two patterns.
isNextSuffixPattern see next 2 patterns can be suffix matcher . If following two cases are both true it could possibly become a suffix matcher . 1 . the first pattern is a Matcher . 2 . the next pattern is a static pattern . If the first matcher can t match the first rune of the second static pattern next pattern should be a suffix matcher combined the two patterns .