func splitQuoted(s string) (r []string, err error) {
	var args []string
	arg := make([]rune, len(s))
	escaped := false
	quoted := false
	quote := '\x00'
	i := 0
	for _, rune := range s {
		switch {
		case escaped:
			escaped = false
		case rune == '\\':
			escaped = true
			continue
		case quote != '\x00':
			if rune == quote {
				quote = '\x00'
				continue
			}
		case rune == '"' || rune == '\'':
			quoted = true
			quote = rune
			continue
		case unicode.IsSpace(rune):
			if quoted || i > 0 {
				quoted = false
				args = append(args, string(arg[:i]))
				i = 0
			}
			continue
		}
		arg[i] = rune
		i++
	}
	if quoted || i > 0 {
		args = append(args, string(arg[:i]))
	}
	if quote != 0 {
		err = errors.New("unclosed quote")
	} else if escaped {
		err = errors.New("unfinished escaping")
	}
	return args, err
}
func splitQuoted(s string) (r []string, err error) {
	var args []string
	arg := make([]rune, len(s))
	escaped := false
	quoted := false
	quote := '\x00'
	i := 0
	for _, rune := range s {
		switch {
		case escaped:
			escaped = false
		case rune == '\\':
			escaped = true
			continue
		case quote != '\x00':
			if rune == quote {
				quote = '\x00'
				continue
			}
		case rune == '"' || rune == '\'':
			quoted = true
			quote = rune
			continue
		case unicode.IsSpace(rune):
			if quoted || i > 0 {
				quoted = false
				args = append(args, string(arg[:i]))
				i = 0
			}
			continue
		}
		arg[i] = rune
		i++
	}
	if quoted || i > 0 {
		args = append(args, string(arg[:i]))
	}
	if quote != 0 {
		err = errors.New("unclosed quote")
	} else if escaped {
		err = errors.New("unfinished escaping")
	}
	return args, err
}
func splitQuoted ( s string ) ( r [ ] string , err error ) { var args [ ] string arg := make ( [ ] rune , len ( s ) ) escaped := false quoted := false quote := '\x00' i := 0 for _ , rune := range s { switch { case escaped : escaped = false case rune == '\\' : escaped = true continue case quote != '\x00' : if rune == quote { quote = '\x00' continue } case rune == '"' || rune == '\'' : quoted = true quote = rune continue case unicode . IsSpace ( rune ) : if quoted || i > 0 { quoted = false args = append ( args , string ( arg [ : i ] ) ) i = 0 } continue } arg [ i ] = rune i ++ } if quoted || i > 0 { args = append ( args , string ( arg [ : i ] ) ) } if quote != 0 { err = errors . New ( " " ) } else if escaped { err = errors . New ( " " ) } return args , err }
// splitQuoted splits the string s around each instance of one or more consecutive
// white space characters while taking into account quotes and escaping, and
// returns an array of substrings of s or an empty list if s contains only white space.
// Single quotes and double quotes are recognized to prevent splitting within the
// quoted region, and are removed from the resulting substrings. If a quote in s
// isn't closed err will be set and r will have the unclosed argument as the
// last element. The backslash is used for escaping.
//
// For example, the following string:
//
//     a b:"c d" 'e''f'  "g\""
//
// Would be parsed as:
//
//     []string{"a", "b:c d", "ef", `g"`}
//
// Copied from go/build.splitQuoted
splitQuoted splits the string s around each instance of one or more consecutive white space characters while taking into account quotes and escaping and returns an array of substrings of s or an empty list if s contains only white space . Single quotes and double quotes are recognized to prevent splitting within the quoted region and are removed from the resulting substrings . If a quote in s isn t closed err will be set and r will have the unclosed argument as the last element . The backslash is used for escaping . For example the following string : a b : c d e f g \ Would be parsed as : [] string { a b : c d ef g } Copied from go / build . splitQuoted