गोलंग में [] स्ट्रिंग और… स्ट्रिंग के बीच क्या अंतर है?


85

गो भाषा में,

[]string एक स्ट्रिंग सरणी है

और हम ...stringएक पैरामीटर के रूप में भी उपयोग करते हैं ।

अंतर क्या है?

कार्य की परिभाषा:

func f(args ...string) {}

क्या मैं नीचे इस फ़ंक्शन को कॉल कर सकता हूं?

args := []string{"a", "b"}

f(args)

जवाबों:


126

[]string एक स्ट्रिंग सरणी है

तकनीकी रूप से यह एक स्लाइस है जो एक अंतर्निहित सरणी को संदर्भित करता है

और हम ...stringएक पैरामीटर के रूप में भी उपयोग करते हैं ।

अंतर क्या है?

संरचना के संबंध में, वास्तव में कुछ भी नहीं। दोनों सिंटैक्स से उत्पन्न डेटा प्रकार समान है।

...पैरामीटर वाक्य रचना एक variadic पैरामीटर बनाता है। यह शून्य या अधिक stringतर्कों को स्वीकार करेगा , और उन्हें एक स्लाइस के रूप में संदर्भित करेगा।

कॉलिंग के संबंध में f, आप निम्न सिंटैक्स के साथ वैरेडिक पैरामीटर में स्ट्रिंग्स का एक टुकड़ा पास कर सकते हैं:

func f(args ...string) {
    fmt.Println(len(args))
}


args := []string{"a", "b"}

f(args...)

यह सिंटैक्स या तो शाब्दिक सिंटैक्स का उपयोग करके निर्मित स्लाइस के लिए उपलब्ध है, या वैरिएबल पैरामीटर का प्रतिनिधित्व करने वाले स्लाइस (क्योंकि उनके बीच वास्तव में कोई अंतर नहीं है)

http://play.golang.org/p/QWmzgIWpF8


10
[]stringएक टुकड़ा है, एक सरणी नहीं है। एक सरणी और टुकड़ा के बीच अंतर सूक्ष्म लेकिन महत्वपूर्ण हैं।
स्टीफन वेनबर्ग

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

@IHateLazy क्या एलिप्सिस के साथ बिलिन का printlnकाम करने का एक तरीका है ? यहाँ आप मेरे प्रयोग पा सकते हैं। यदि कोई कुछ डिबग प्रिंट फ़ंक्शन चाहता है, तो मेरे playgound को देखें।
तिजोरी

14

दोनों तार की एक सरणी बनाते हैं, लेकिन अंतर यह है कि इसे कैसे कहा जाता है।

func f(args ...string) {

}
// Would be called like this:

f("foo","bar","baz");

यह आपको एक चर संख्या के तर्कों को स्वीकार करने की अनुमति देता है (सभी एक ही प्रकार के)

इसका एक बड़ा उदाहरण है fmt.Printऔर दोस्तों, जो आप चाहते हैं के रूप में कुछ या के रूप में कई तर्क स्वीकार कर सकते हैं।


मैं कोई विशेषज्ञ नहीं हूं, लेकिन एक वैरिएबल तर्क और दूसरा एक सरणी तर्क नहीं है, और अन्य भाषाओं की तरह दो अलग नहीं हैं?
ऑर्बिट

1
@LightnessRacesinOrbit यप। यदि यह स्पष्ट नहीं है तो भ्रम के लिए खेद है। दोनों एक सरणी बनाने के बारे में पहली पंक्ति का अर्थ है कि दोनों उदाहरणों में परिणामी तर्क एक सरणी है। यह अजगर के def fn(*args)निर्माण के लगभग समान है ।
tylerl

तो गो एक प्रकार के उदाहरण के रूप में वैरिएड तर्कों को उजागर करता है? यही मनभावन है।
ऑर्बिट

वास्तव में वे दोनों स्ट्रिंग्स का एक टुकड़ा बनाते हैं, न कि एक सरणी। वे गोलंग में अलग-अलग चीजें हैं।
पॉइंटरटॉन्स्टैंटचेयर

दोनों स्ट्रिंग्स का "ऐरे" नहीं बनाते, वे स्ट्रिंग्स का "स्लाइस" बनाते हैं।
इनक गमुस


1

यह आपके फ़ंक्शन मापदंडों को सरल करता है। यहाँ एक उदाहरण है ( https://play.golang.org/p/euMuy6IvaM ): विधि SampleEllipsis शून्य से एक ही प्रकार के कई मापदंडों के लिए, लेकिन विधि SampleArray में यह अनिवार्य है स्वीकार करता है आर्ग घोषित किया जाना है।

package main

import "fmt"

func SampleEllipsis(args ...string) {
    fmt.Printf("Sample ellipsis : %+v\n",args)
}


func SampleArray(args []string) {
    fmt.Println("Sample array ")
    SampleEllipsis(args...)
}

func main() {
    // Method one
    SampleEllipsis([]string{"A", "B", "C"}...)
    // Method two
    SampleEllipsis("A", "B", "C")
    // Method three
    SampleEllipsis()

    // Simple array
    SampleArray([]string{"A", "B", "C"})

    // Simple array
    SampleArray([]string{})

}

रिटर्न:

Sample ellipsis : [A B C]
Sample ellipsis : [A B C]
Sample ellipsis : []
Sample array 
Sample ellipsis : [A B C]
Sample array 
Sample ellipsis : []
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.