Невозможно преобразовать [] строку в [] интерфейс {}
Я пишу код, и мне нужно его, чтобы поймать аргументы и передать их через fmt.Println
(Я хочу, чтобы его поведение по умолчанию, чтобы писать аргументы, разделенные пробелами, а затем новую строку). Однако требуется []interface {}
, но flag.Args()
возвращает a []string
.
Вот пример кода:
package main
import (
"fmt"
"flag"
)
func main() {
flag.Parse()
fmt.Println(flag.Args()...)
}
Это возвращает следующую ошибку:
./example.go:10: cannot use args (type []string) as type []interface {} in function argument
Это ошибка? Нельзя fmt.Println
взять любой массив? Кстати, я тоже пытался это сделать:
var args = []interface{}(flag.Args())
но я получаю следующую ошибку:
cannot convert flag.Args() (type []string) to type []interface {}
Есть ли способ "Перейти", чтобы обход этого?
Ответы
Ответ 1
Это не ошибка. fmt.Println()
требуется тип []interface{}
. Это означает, что это должен быть срез значений interface{}
, а не "любой фрагмент". Чтобы преобразовать срез, вам нужно будет перебрать и скопировать каждый элемент.
old := flag.Args()
new := make([]interface{}, len(old))
for i, v := range old {
new[i] = v
}
fmt.Println(new...)
Причина, по которой вы не можете использовать какой-либо фрагмент, заключается в том, что преобразование между []string
и a []interface{}
требует изменения макета памяти и происходит в O (n) времени. Для преобразования типа в interface{}
требуется время O (1). Если они сделали это для цикла ненужным, компилятору все равно нужно было бы его вставить.
Ответ 2
Если это только фрагмент строк, которые вы хотите распечатать, вы можете избежать преобразования и получить тот же результат, присоединив:
package main
import (
"fmt"
"flag"
"strings"
)
func main() {
flag.Parse()
s := strings.Join(flag.Args(), " ")
fmt.Println(s)
}