Як я можу передати фрагмент як варіатичний ввід?


86

У мене є функція func more(... t). Цікаво, чи можливо використовувати фрагмент для заповнення списку аргументів ....

Я намагаюся вирішити наступну програму. В основному імітувати звичайну оболонку, яка отримує команду як рядок. Командна функція вимагає "списку" аргументів, і я не бачу, як я можу перетворити рядок у такий список

    import "os/exec"
    import "strings"
    func main(){
        plainCommand  := "echo hello world"
        sliceA := strings.Fields(plainCommand)
        cmd := exec.Command(sliceA)
    }

Відповіді:


101

Специфікація мови програмування Go

Передача аргументів у ... параметри

Якщо f є варіатичним із кінцевим типом параметра ... T, то в межах функції аргумент еквівалентний параметру типу [] T. При кожному виклику f аргументом, переданим кінцевому параметру, є новий зріз типу [] T, послідовними елементами якого є фактичні аргументи, які всі повинні бути присвоєні типу T. Довжина зрізу, отже, є числом аргументи, прив'язані до остаточного параметра, і можуть відрізнятися для кожного сайту виклику.


Пакунок exec

func Command

func Command(name string, arg ...string) *Cmd

Команда повертає структуру Cmd для виконання названої програми з заданими аргументами.

Поле Arg, що повертається, складається з імені команди, за якою йдуть елементи arg, тому arg не повинен включати саме ім'я команди. Наприклад, Command ("echo", "hello")


Наприклад,

package main

import (
    "fmt"
    "os/exec"
)

func main() {
    name := "echo"
    args := []string{"hello", "world"}
    cmd := exec.Command(name, args...)
    out, err := cmd.Output()
    if err != nil {
        fmt.Println(err)
    }
    fmt.Println(string(out))
}

Вихід:

hello world

10

Список аргументів команд можна отримати з функції пакета прапорівArgs() . Потім ви можете передати це функції за допомогою варіативного стилю введення ( func(input...))

З специфікації :

Якщо f є варіатичним із кінцевим типом параметра ... T, то в межах функції аргумент еквівалентний параметру типу [] T. При кожному виклику f аргумент, переданий кінцевому параметру, є новим зрізом типу [] T, послідовними елементами якого є фактичні аргументи, які всі повинні бути присвоєні типу T.

Приклад:

package main

import "fmt"

func echo(strings ...string) {
    for _, s := range strings {
        fmt.Println(s)
    }
}

func main() {
    strings := []string{"a", "b", "c"}
    echo(strings...) // Treat input to function as variadic
}

Докладніше див. У специфікації The Go .

Дитячий майданчик


5

func Command

func Command(name string, arg ...string) *Cmd

Команда повертає структуру Cmd для виконання названої програми з заданими аргументами.

Отже, вам потрібно витягти команду, яка знаходиться в, sliceA[0]а потім передати всі аргументи варіативно, але видаливши команду sliceA[1:]....

import "os/exec"
import "strings"
func main(){
    plainCommand  := "echo hello world"
    sliceA := strings.Fields(plainCommand)
    cmd := exec.Command(sliceA[0], sliceA[1:]...)
}
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.