Как сделать тип для вариационной функции [duplicate]

Указатель NULL - это тот, который указывает на никуда. Когда вы разыскиваете указатель p, вы говорите «дайте мне данные в месте, хранящемся в« p ». Когда p является нулевым указателем, местоположение, хранящееся в p, является nowhere, вы говорите «Дайте мне данные в месте« нигде ». Очевидно, он не может этого сделать, поэтому он выбрасывает NULL pointer exception.

В общем, это потому, что что-то не было правильно инициализировано.

26
задан The user with no hat 18 May 2014 в 17:20
поделиться

3 ответа

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

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

Если f является переменным с конечным типом параметра ... T, то внутри функции аргумент эквивалентен параметру типа [] T. При каждом вызове f аргумент, передаваемый окончательному параметру, представляет собой новый срез типа [] T, последовательные элементы которого являются фактическими аргументами, которые все должны быть назначены типу T. Следовательно, длина среза равна числу аргументы, связанные с конечным параметром, и могут различаться для каждого сайта вызова.


Package exec

func Command

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

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

Возвращенное поле Cmd's Args построено из имени команды по элементам arg, поэтому arg не должен включать имя самой команды. Например, команда («эхо», «привет»)


Например,

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
44
ответ дан peterSO 19 August 2018 в 12:04
поделиться
  • 1
    он не работает. вы попробовали? не может использовать args (type [] string) как строка типа в аргументе функции – The user with no hat 18 May 2014 в 17:19
  • 2
    @ Theuserwithnohat: Он работает для меня. – peterSO 18 May 2014 в 17:23
  • 3
    это действительно так. Я не видел ... после аргументов. Это выглядит странно – The user with no hat 18 May 2014 в 17:29

Список аргументов команды можно получить из функции флажка Args() . Затем вы можете передать это функции с использованием стиля вариационного ввода (func(input...))

Из Spec :

Если 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
}

Подробнее см. В Спецификация Go .

Игровая площадка

4
ответ дан Intermernet 19 August 2018 в 12:04
поделиться
  • 1
    вопрос заключается в том, как передать срез как переменный вход, а не как разобрать переменный вход – The user with no hat 18 May 2014 в 17:20
  • 2
    Я ответил на этот вопрос. Пожалуйста, перечитайте его. Мой пример передает срез как переменный вход. – Intermernet 18 May 2014 в 17:21

func Команда

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:]...)
}
0
ответ дан Nathenapse 19 August 2018 в 12:04
поделиться
Другие вопросы по тегам:

Похожие вопросы: