Подтвердить что ты не робот

Невозможно преобразовать [] строку в [] интерфейс {}

Я пишу код, и мне нужно его, чтобы поймать аргументы и передать их через 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 {}

Есть ли способ "Перейти", чтобы обход этого?

4b9b3361

Ответ 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)
}