string.go
func StringJoinFormat(format string, values interface{}, sep string) string {
	v := reflect.ValueOf(values)
	if v.Kind() != reflect.Slice {
		panic("values is not a slice")
	}
	var buffer bytes.Buffer
	for i := 0; i < v.Len(); i++ {
		if i > 0 {
			buffer.WriteString(sep)
		}
		buffer.WriteString(fmt.Sprintf(format, v.Index(i).Interface()))
	}
	return buffer.String()
}
func StringJoinFormat(format string, values interface{}, sep string) string {
	v := reflect.ValueOf(values)
	if v.Kind() != reflect.Slice {
		panic("values is not a slice")
	}
	var buffer bytes.Buffer
	for i := 0; i < v.Len(); i++ {
		if i > 0 {
			buffer.WriteString(sep)
		}
		buffer.WriteString(fmt.Sprintf(format, v.Index(i).Interface()))
	}
	return buffer.String()
}
func StringJoinFormat ( format string , values interface { } , sep string ) string { v := reflect . ValueOf ( values ) if v . Kind ( ) != reflect . Slice { panic ( " " ) } var buffer bytes . Buffer for i := 0 ; i < v . Len ( ) ; i ++ { if i > 0 { buffer . WriteString ( sep ) } buffer . WriteString ( fmt . Sprintf ( format , v . Index ( i ) . Interface ( ) ) ) } return buffer . String ( ) }
// StringJoinFormat formats every value in values with format
// and joins the result with sep as separator.
// values must be a slice of a formatable type
StringJoinFormat formats every value in values with format and joins the result with sep as separator . values must be a slice of a formatable type