तर्क के रूप में अनपैकिंग ऐरे जाओ


104

तो पायथन और रूबी में तर्कों के रूप में एक सरणी को अनपैक करने के लिए स्पैट ऑपरेटर (*) है। जावास्क्रिप्ट में .apply () फ़ंक्शन है। क्या गो में फ़ंक्शन तर्क के रूप में किसी सरणी / स्लाइस को अनपैक करने का एक तरीका है? इसके लिए कोई भी संसाधन बहुत अच्छा होगा!

इस की तर्ज पर कुछ:

func my_func(a, b int) (int) {
    return a + b
}

func main() {
    arr := []int{2,4}
    sum := my_func(arr)
}

यदि मैं एक वाक्यात्मक / मिश्रित गलतियाँ कर रहा हूँ, तो मैं माफी माँगता हूँ। मैं गो टू नया हूं।


4
सबसे पहले, arrएक सरणी नहीं है। यह एक स्लाइस है
newacct

जवाबों:


160

आप C के समान एक vararg सिंटैक्स का उपयोग कर सकते हैं:

package main
import "fmt"

func my_func( args ...int) int {
   sum := 0
   for _,v := range args {
      sum = sum + v
   }

   return sum;
}

func main() {
    arr := []int{2,4}
    sum := my_func(arr...)
    fmt.Println("Sum is ", sum)
}

अब आप जितनी चाहें उतनी चीजें जमा कर सकते हैं। ...जब आप my_funcफ़ंक्शन को कॉल करते हैं तब महत्वपूर्ण सूचना दें ।

चल उदाहरण: http://ideone.com/8htWfx


8

या तो आपका फ़ंक्शन varargs है, जिसमें आप ...हंटर मैकमिलन शो के रूप में नोटेशन के साथ एक स्लाइस का उपयोग कर सकते हैं , या आपके फ़ंक्शन के पास निश्चित संख्या में तर्क हैं और आप अपना कोड लिखते समय उन्हें अनपैक कर सकते हैं।

यदि आप वास्तव में निश्चित संख्या के तर्कों के कार्य पर इसे गतिशील रूप से करना चाहते हैं, तो आप प्रतिबिंब का उपयोग कर सकते हैं:

package main
import "fmt"
import "reflect"

func my_func(a, b int) (int) {
    return a + b
}

func main() {
    arr := []int{2,4}
    var args []reflect.Value
    for _, x := range arr {
        args = append(args, reflect.ValueOf(x))
    }
    fun := reflect.ValueOf(my_func)
    result := fun.Call(args)
    sum := result[0].Interface().(int)
    fmt.Println("Sum is ", sum)
}

मैं यह देखने के लिए उत्सुक हूं कि यह कैसे varargs दृष्टिकोण के खिलाफ बेंचमार्क है। मुझे लगता है कि यह कम कुशलता से प्रदर्शन करेगा, लेकिन मुझे इस पर गौर करना होगा।
हंटर मैकमिलन

@HunterMcMillen क्या आपको प्रदर्शन तुलना के बारे में कोई जानकारी मिली है?
AkiRoss

@AkiRoss शायद, लेकिन यह बहुत पहले था कि मैं परिणाम भूल गया हूँ: |
हंटर मैकमिलन

योग्य ठीक है, कोई बड़ी बात नहीं: मुझे लगता है कि यह वैसे भी धीमी है, शायद मैं खुद कुछ परीक्षण चलाऊंगा। Thanx
AkiRoss

0

https://play.golang.org/p/2nN6kjHXIsd

मेरे पास एक नक्शा [स्ट्रिंग] स्ट्रिंग के कुछ संस्करणों को अनपैक करने का एक कारण था, जिनमें से कुछ के साथ-साथ बिना उद्धरण के भी। यहाँ इसके लिए तर्क दिया गया है और ऊपर की तरफ प्ले लिंक को पूर्ण रूप से काम करने वाला स्निपेट दिया गया है।

func unpack(a map[string]string) string {

var stmt, val string
var x, y []string
for k, v := range a {
    x = append(x, k)
    y = append(y, "'"+v+"'")
}

stmt = "INSERT INTO tdo.rca_trans_status (" + strings.Join(x, ", ")
val = ") VALUES (" + strings.Join(y, ",") + ");"

return stmt + val}

जो mssql क्वेरी के लिए सफाई के रूप में प्रस्तुत करता है:

INSERT INTO tdo.rca_trans_status (rca_json_body, original_org, md5sum, updated, rca_key) VALUES ('blob','EG','2343453463','2009-11-10 23:00:00','prb-180');

-16

नहीं, भाषा में इसके लिए कोई प्रत्यक्ष समर्थन नहीं है। अजगर और रूबी, साथ ही साथ जावास्क्रिप्ट जो आप उल्लेख कर रहे हैं; सभी गतिशील / स्क्रिप्टिंग भाषाएं हैं। गो, किसी भी गतिशील भाषा की तुलना में, उदाहरण के लिए, C के करीब है। गतिशील भाषाओं के लिए 'लागू' कार्यक्षमता आसान है, लेकिन सी या गो जैसी स्थिर भाषाओं के लिए बहुत कम उपयोग होता है,


@ user7610 आप गलत हैं। आप प्रश्न की तुलना में अलग-अलग मामलों में परिणाम दे रहे हैं। मूल प्रश्न में, फ़ंक्शन घोषणा में कोई वैरेडिक पैरामीटर नहीं है।
user2846569

हाँ, मैं था, मुझे लगता है। पाइथन / रूबी ने चिंतनशील कॉल के लिए सिंटैक्टिक शुगर के रूप में सोचा जा सकता है कि गो समर्थन करता है ...
user7610
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.