Пример источника:
// source multidimensional slice
var source = []interface{}{
"value1",
"value2",
1234,
1234.1234,
[]int{222, 333},
[]float32{444.444, 555.555},
[]interface{}{555, "value4", []int{777, 888}}
}
Цель:
// target []string
var target = []string{
"value1",
"value2",
"1234",
"1234.1234",
"222",
"333",
"444.444",
"555.555",
"555",
"value4",
"777",
"888"
}
Я написал функцию преобразования. Но он кажется мне громоздким и не охватывает все возможные варианты. Подскажите пожалуйста может быть есть более изящное решение?
// convert multidimensional slice []interface{} to slice []string
func convert(raw interface{}) (result []string) {
switch raw.(type) {
case []string:
result = append(result, raw.([]string) ...)
case []int:
for _, elem := range raw.([]int) {
result = append(result, convert(elem) ...)
}
case string, int, int8, int16, int32, int64, float32, float64, complex64, complex128:
result = append(result, fmt.Sprintf("%v", raw))
case []float32:
for _, elem := range raw.([]float32) {
result = append(result, convert(elem) ...)
}
case []rune:
for _, elem := range raw.([]rune) {
result = append(result, convert(elem) ...)
}
case []int8:
for _, elem := range raw.([]int8) {
result = append(result, convert(elem) ...)
}
case []int16:
for _, elem := range raw.([]int16) {
result = append(result, convert(elem) ...)
}
case []int64:
for _, elem := range raw.([]int64) {
result = append(result, convert(elem) ...)
}
case []float64:
for _, elem := range raw.([]float64) {
result = append(result, convert(elem) ...)
}
case []complex64:
for _, elem := range raw.([]complex64) {
result = append(result, convert(elem) ...)
}
case []complex128:
for _, elem := range raw.([]complex128) {
result = append(result, convert(elem) ...)
}
case []interface{}:
for _, elem := range raw.([]interface{}) {
result = append(result, convert(elem) ...)
}
case [][]interface{}:
for _, elem := range raw.([][]interface{}) {
result = append(result, convert(elem) ...)
}
default:
fmt.Println(fmt.Sprintf("Unknown type %v", raw))
os.Exit(1)
}
return result
}