Làm cách nào để chuyển một lát cắt làm đầu vào đa dạng?


86

Tôi có một chức năng func more(... t). Tôi tự hỏi liệu có thể sử dụng một lát cắt để điền danh sách các đối số hay không ....

Tôi đang cố gắng giải quyết chương trình sau. Về cơ bản để bắt chước một trình bao bình thường nhận lệnh dưới dạng một chuỗi. Hàm lệnh yêu cầu một "danh sách" các đối số và tôi không biết làm cách nào để chuyển đổi một chuỗi thành một danh sách như vậy

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

Câu trả lời:


101

Đặc tả ngôn ngữ lập trình Go

Truyền đối số cho ... tham số

Nếu f khác biến với kiểu tham số cuối cùng là ... T, thì trong hàm đối số tương đương với tham số kiểu [] T. Tại mỗi lần gọi của f, đối số được truyền cho tham số cuối cùng là một lát cắt mới kiểu [] T có các phần tử kế tiếp là các đối số thực tế, tất cả các phần tử này phải được gán cho kiểu T. Do đó, độ dài của lát cắt là số đối số liên kết với tham số cuối cùng và có thể khác nhau đối với mỗi trang web cuộc gọi.


Gói thực thi

Lệnh func

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

Lệnh trả về cấu trúc Cmd để thực thi chương trình đã đặt tên với các đối số đã cho.

Trường Args của Cmd trả về được xây dựng từ tên lệnh theo sau là các phần tử của arg, vì vậy, arg không nên bao gồm chính tên lệnh. Ví dụ: Command ("echo", "hello")


Ví dụ,

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))
}

Đầu ra:

hello world

10

Danh sách các đối số lệnh có thể được truy xuất từ hàm gói cờArgs() . Sau đó, bạn có thể chuyển nó cho một hàm bằng cách sử dụng kiểu nhập variadic ( func(input...))

Từ thông số kỹ thuật :

Nếu f khác biến với kiểu tham số cuối cùng là ... T, thì trong hàm đối số tương đương với tham số kiểu [] T. Tại mỗi lần gọi của f, đối số được truyền cho tham số cuối cùng là một lát cắt kiểu mới [] T có các phần tử kế tiếp nhau là các đối số thực tế, tất cả các đối số này phải được gán cho kiểu T.

Thí dụ:

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
}

Xem thông số kỹ thuật của Go để biết thêm chi tiết.

Sân chơi


5

Lệnh func

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

Lệnh trả về cấu trúc Cmd để thực thi chương trình đã đặt tên với các đối số đã cho.

Vì vậy, bạn phải trích xuất lệnh được tìm thấy tại sliceA[0]và sau đó chuyển tất cả các đối số với một biến thể nhưng loại bỏ lệnh sliceA[1:]....

import "os/exec"
import "strings"
func main(){
    plainCommand  := "echo hello world"
    sliceA := strings.Fields(plainCommand)
    cmd := exec.Command(sliceA[0], sliceA[1:]...)
}
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.