ฉันจะส่งสไลซ์เป็นอินพุตตัวแปรได้อย่างไร


89

func more(... t)ฉันมีฟังก์ชั่น ...ฉันสงสัยว่าถ้ามันเป็นไปได้ที่จะใช้ชิ้นเพื่อเติมรายชื่อของการขัดแย้ง

ฉันกำลังพยายามแก้โปรแกรมต่อไปนี้ โดยทั่วไปจะเลียนแบบเชลล์ปกติซึ่งรับคำสั่งเป็นสตริง ฟังก์ชันคำสั่งต้องการ "รายการ" ของอาร์กิวเมนต์และฉันไม่เห็นว่าจะแปลงสตริงเป็นรายการดังกล่าวได้อย่างไร

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

คำตอบ:


103

ข้อกำหนดภาษาโปรแกรม Go

ส่งผ่านอาร์กิวเมนต์ไปยัง ... พารามิเตอร์

ถ้า f เป็นตัวแปรที่มีประเภทพารามิเตอร์สุดท้าย ... T ดังนั้นภายในฟังก์ชันอาร์กิวเมนต์จะเทียบเท่ากับพารามิเตอร์ประเภท [] T ในการเรียก f แต่ละครั้งอาร์กิวเมนต์ที่ส่งไปยังพารามิเตอร์สุดท้ายคือส่วนใหม่ของประเภท [] T ที่มีองค์ประกอบต่อเนื่องเป็นอาร์กิวเมนต์ที่แท้จริงซึ่งทั้งหมดจะต้องกำหนดให้กับประเภท T ได้ดังนั้นความยาวของชิ้นจึงเป็นจำนวน อาร์กิวเมนต์ที่เชื่อมโยงกับพารามิเตอร์สุดท้ายและอาจแตกต่างกันไปสำหรับไซต์การโทรแต่ละแห่ง


ผู้บริหารแพ็คเกจ

คำสั่ง func

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

คำสั่งส่งคืนโครงสร้าง Cmd เพื่อรันโปรแกรมที่ระบุชื่อด้วยอาร์กิวเมนต์ที่กำหนด

ฟิลด์ Args ของ Cmd ที่ส่งคืนถูกสร้างจากชื่อคำสั่งตามด้วยองค์ประกอบของ 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

11

รายการของอาร์กิวเมนต์คำสั่งสามารถเรียกดูได้จากแพคเกจธง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
}

ดูข้อมูลจำเพาะของ Goสำหรับรายละเอียดเพิ่มเติม

สนามเด็กเล่น


6

คำสั่ง func

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

คำสั่งส่งคืนโครงสร้าง Cmd เพื่อรันโปรแกรมที่ระบุชื่อด้วยอาร์กิวเมนต์ที่กำหนด

ดังนั้นคุณต้องแยกคำสั่งซึ่งจะพบได้ที่sliceA[0]แล้วผ่านการขัดแย้งทั้งหมดที่มี variadic sliceA[1:]...แต่เอาคำสั่ง

import "os/exec"
import "strings"
func main(){
    plainCommand  := "echo hello world"
    sliceA := strings.Fields(plainCommand)
    cmd := exec.Command(sliceA[0], sliceA[1:]...)
}
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.