मैं एक वैरिएड इनपुट के रूप में एक स्लाइस कैसे पास कर सकता हूं?


86

मेरा एक फंक्शन है func more(... t)। मैं सोच रहा था कि क्या तर्कों की एक सूची को आबाद करने के लिए एक स्लाइस का उपयोग करना संभव है ...

मैं निम्नलिखित कार्यक्रम को हल करने की कोशिश कर रहा हूं। मूल रूप से एक सामान्य शेल की नकल करने के लिए जो एक स्ट्रिंग के रूप में कमांड प्राप्त करता है। कमांड फ़ंक्शन को तर्कों की "सूची" की आवश्यकता होती है और मैं यह नहीं देखता कि मैं एक स्ट्रिंग को ऐसी सूची में कैसे बदल सकता हूं

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

जवाबों:


101

गो प्रोग्रामिंग भाषा विशिष्टता

तर्कों को पास करना ... पैरामीटर

यदि f अंतिम पैरामीटर प्रकार के साथ चर है ... T, तो फ़ंक्शन के भीतर तर्क टाइप [] T के पैरामीटर के बराबर है। F के प्रत्येक कॉल पर, अंतिम पैरामीटर के लिए दिया गया तर्क टाइप का एक नया टुकड़ा है [] T जिसके उत्तरवर्ती तत्व वास्तविक तर्क हैं, जिन्हें सभी को T के प्रकार के लिए असाइन किया जाना चाहिए। स्लाइस की लंबाई इसलिए संख्या है अंतिम पैरामीटर के लिए तर्क और प्रत्येक कॉल साइट के लिए भिन्न हो सकते हैं।


पैकेज निष्पादन

func कमांड

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

कमांड दिए गए तर्कों के साथ नामित प्रोग्राम को निष्पादित करने के लिए Cmd संरचना लौटाता है।

दिए गए Cmd के 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

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
}

देखें जाओ कल्पना अधिक जानकारी के लिए।

खेल का मैदान


5

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:]...)
}
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.