code: func UnquoteExtend(s string) (string, 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 != '"' && quote != '\'' {
  		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 := strconv.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
  }
docs: //UnquoteExtend is almost same as strconv.Unquote(), but it support parse single quotes as a string