func Unquote(s string) (t string, err error) {
	n := len(s)
	if n < 2 {
		return "", ErrSyntax
	}
	quote := s[0]
	if quote != s[n-1] {
		return "", ErrSyntax
	}
	s = s[1 : n-1]

	if quote == '`' {
		if contains(s, '`') {
			return "", ErrSyntax
		}
		return s, nil
	}
	if quote != '"' && quote != '\'' {
		return "", ErrSyntax
	}
	if contains(s, '\n') {
		return "", ErrSyntax
	}

	// Is it trivial?  Avoid allocation.
	if !contains(s, '\\') && !contains(s, quote) {
		return s, nil
	}

	var runeTmp [utf8.UTFMax]byte
	buf := make([]byte, 0, 3*len(s)/2) // Try to avoid more allocations.
	for len(s) > 0 {
		c, multibyte, ss, err := unquoteChar(s, quote)
		if err != nil {
			return "", err
		}
		s = ss
		if c < utf8.RuneSelf || !multibyte {
			buf = append(buf, byte(c))
		} else {
			n := utf8.EncodeRune(runeTmp[:], c)
			buf = append(buf, runeTmp[:n]...)
		}
	}
	return string(buf), nil
}
func Unquote(s string) (t string, err error) {
	n := len(s)
	if n < 2 {
		return "", ErrSyntax
	}
	quote := s[0]
	if quote != s[n-1] {
		return "", ErrSyntax
	}
	s = s[1 : n-1]

	if quote == '`' {
		if contains(s, '`') {
			return "", ErrSyntax
		}
		return s, nil
	}
	if quote != '"' && quote != '\'' {
		return "", ErrSyntax
	}
	if contains(s, '\n') {
		return "", ErrSyntax
	}

	
	if !contains(s, '\\') && !contains(s, quote) {
		return s, nil
	}

	var runeTmp [utf8.UTFMax]byte
	buf := make([]byte, 0, 3*len(s)/2) 
	for len(s) > 0 {
		c, multibyte, ss, err := unquoteChar(s, quote)
		if err != nil {
			return "", err
		}
		s = ss
		if c < utf8.RuneSelf || !multibyte {
			buf = append(buf, byte(c))
		} else {
			n := utf8.EncodeRune(runeTmp[:], c)
			buf = append(buf, runeTmp[:n]...)
		}
	}
	return string(buf), nil
}
func Unquote ( s string ) ( t string , err error ) { n := len ( s ) if n < 2 { return " " , ErrSyntax } quote := s [ 0 ] if quote != s [ n - 1 ] { return " " , ErrSyntax } s = s [ 1 : n - 1 ] if quote == '`' { if contains ( s , '`' ) { return " " , ErrSyntax } return s , nil } if quote != '"' && quote != '\'' { return " " , ErrSyntax } if contains ( s , '\n' ) { return " " , ErrSyntax } // Is it trivial?  Avoid allocation. if ! contains ( s , '\\' ) && ! contains ( s , quote ) { return s , nil } var runeTmp [ utf8 . UTFMax ] byte buf := make ( [ ] byte , 0 , 3 * len ( s ) / 2 ) // Try to avoid more allocations. for len ( s ) > 0 { c , multibyte , ss , err := unquoteChar ( s , quote ) if err != nil { return " " , err } s = ss if c < utf8 . RuneSelf || ! multibyte { buf = append ( buf , byte ( c ) ) } else { n := utf8 . EncodeRune ( runeTmp [ : ] , c ) buf = append ( buf , runeTmp [ : n ] ... ) } } return string ( buf ) , nil }
// Unquote interprets s as a single-quoted, double-quoted, or backquoted
// Prometheus query language string literal, returning the string value that s
// quotes.
//
// NOTE: This function as well as the necessary helper functions below
// (unquoteChar, contains, unhex) and associated tests have been adapted from
// the corresponding functions in the "strconv" package of the Go standard
// library to work for Prometheus-style strings. Go's special-casing for single
// quotes was removed and single quoted strings are now treated the same as
// double quoted ones.
Unquote interprets s as a single - quoted double - quoted or backquoted Prometheus query language string literal returning the string value that s quotes . NOTE : This function as well as the necessary helper functions below ( unquoteChar contains unhex ) and associated tests have been adapted from the corresponding functions in the strconv package of the Go standard library to work for Prometheus - style strings . Go s special - casing for single quotes was removed and single quoted strings are now treated the same as double quoted ones .