идиома для отображения нескольких «аргументов» в один вариационный параметр - PullRequest
0 голосов
/ 08 июля 2019

Есть ли способ использовать комбинацию аргументов с разделителями и простых аргументов (определенных ниже) в функции, принимающей переменный параметр в golang? Если нет, то есть ли известная идиома, которая приближает эту функцию? Если возможно, существует ли идиома, приближающая эту функцию, которая не требует повторения имени типа?


Предположим, у меня есть функция с переменным параметром в golang типа ...T. Похоже, что ваши возможности на сайте вызова ограничены:

  • несколько простых аргументов , каждый из которых типа T, т.е. f(…… x1, x2, x3 ……)
  • один аргумент типа []T, т. Е. f(…… ...xs ……)

В некоторых других языках, таких как Python, можно захватывать комбинацию простых аргументов и аргументов с аргументами с аргументом variadic:

$ python
>>> def foo(*args): return args
... 
>>> foo(1, 2, *[3, 4])
(1, 2, 3, 4)

Однако, похоже, что то же самое не работает на ходу.

// splat.go
package main

import "os"
import "fmt"

func write(args ...string) {
        for _, item := range args {
                fmt.Printf("%s\n", item)
        }
}

func main() {
        write("foobarbaz", os.Args[1:]...)
}

из сообщения об ошибке ясно, что аргумент splatted и простой аргумент не отображаются на один и тот же параметр.

$ go run splat.go 
# command-line-arguments
./splat.go:14: too many arguments in call to write

1 Ответ

1 голос
/ 08 июля 2019

Создайте фрагмент со всеми аргументами и разделите этот фрагмент.

write(append([]string{"foobarbaz"}, os.Args[1:]...)...)

Если шаблон кода string, []string распространен в коде приложения, подумайте над написанием функции, упрощающей код на сайтах вызовов:

func stringArgs(s string, args []string) []string { 
   return append([]string{s}, args...)
}

...

write(stringArgs("foobarbaz", os.Args[1:])...)

или

func writeStringArgs(s string, args []string) {
    write(append([]string{"foobarbaz"}, os.Args[1:]...)...)
}

...

writeStringArgs(s, os.Args[1:])
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...