Go में Pair / tuple data type


118

करते समय गो की यात्रा के अंतिम अभ्यास , मैंने तय कर लिया कि मैं (की एक कतार जरूरत string, int) जोड़े। यह काफी आसान है:

type job struct {
    url string
    depth int
}

queue := make(chan job)
queue <- job{url, depth}

लेकिन यह मुझे सोच रहा था: क्या गो में अंतर्निहित जोड़ी / टपल डेटा प्रकार हैं? एक फ़ंक्शन से कई मान वापस करने के लिए समर्थन है , लेकिन AFAICT, उत्पादित कई मूल्य ट्यूप गो के प्रकार प्रणाली में प्रथम श्रेणी के नागरिक नहीं हैं। क्या यह मामला है?

"क्या आपने कोशिश की है" भाग के लिए, स्पष्ट वाक्यविन्यास (पायथन प्रोग्रामर के पीओवी से)

queue := make(chan (string, int))

काम नहीं किया।

जवाबों:


57

गो में कोई भी प्रकार नहीं है, और आप सही हैं, फ़ंक्शंस द्वारा दिए गए कई मान प्रथम श्रेणी के ऑब्जेक्ट का प्रतिनिधित्व नहीं करते हैं।

निक के जवाब से पता चलता है कि आप कैसे कुछ ऐसा कर सकते हैं जो मनमाने प्रकार का उपयोग कर संभालता है interface{}। (मैंने एक संरचना की बजाय एक सारणी का उपयोग किया हो सकता है, इसे एक टपल की तरह अनुक्रमित करने के लिए, लेकिन मुख्य विचार interface{}प्रकार है)

मेरे अन्य उत्तर से पता चलता है कि आप कुछ ऐसा कैसे कर सकते हैं जो गुमनाम संरचनाओं का उपयोग करके एक प्रकार बनाने से बचता है।

इन तकनीकों में टुपल्स के कुछ गुण हैं, लेकिन नहीं, वे टुपल्स नहीं हैं।


91

तुम यह केर सकते हो। यह एक टपल की तुलना में अधिक चिंताजनक है, लेकिन यह एक बड़ा सुधार है क्योंकि आपको टाइपिंग की जाँच मिलती है।

संपादित करें: निक के सुझाव के बाद, पूरी तरह से काम कर रहे उदाहरण के साथ बदला गया स्निपेट। खेल का मैदान लिंक: http://play.golang.org/p/RNx_otTFpk

package main

import "fmt"

func main() {
    queue := make(chan struct {string; int})
    go sendPair(queue)
    pair := <-queue
    fmt.Println(pair.string, pair.int)
}

func sendPair(queue chan struct {string; int}) {
    queue <- struct {string; int}{"http:...", 3}
}

अनाम संरचनाएं और क्षेत्र इस तरह के त्वरित और गंदे समाधानों के लिए ठीक हैं। हालांकि सभी सरलतम मामलों के लिए, आप एक नामांकित संरचना को परिभाषित करने के लिए बेहतर करेंगे जैसे आपने किया था।


9
आपको शायद यह वर्णन करना चाहिए कि अनाम संरचनात्मक सदस्यों से मूल्यों को कैसे प्राप्त किया जाए क्योंकि मुझे नहीं लगता कि यह शुरुआती के लिए स्पष्ट है!
निक क्रेग-वुड

9
हालाँकि, यह काम नहीं करेगा यदि एक ही प्रकार के कई क्षेत्र हैं
newacct

1
आप एक अनाम संरचना में फ़ील्ड का नाम दे सकते हैं, आपको बस यह सुनिश्चित करना है कि फ़ील्ड उसी तरह नामित किए जाएं जैसे प्रत्येक स्थान पर अनाम संरचना परिभाषा प्रकट होती है (इस उदाहरण में तीन बार।) अनाम फ़ील्ड आसान हैं यदि आप इसके साथ भाग सकते हैं। ।
सोनिया

5
तो जवाब है "नहीं, कोई टुपल टाइप नहीं है"?
फ्रेड फू

37

आप चाहते तो कुछ ऐसा कर सकते थे

package main

import "fmt"

type Pair struct {
    a, b interface{}
}

func main() {
    p1 := Pair{"finished", 42}
    p2 := Pair{6.1, "hello"}
    fmt.Println("p1=", p1, "p2=", p2)
    fmt.Println("p1.b", p1.b)
    // But to use the values you'll need a type assertion
    s := p1.a.(string) + " now"
    fmt.Println("p1.a", s)
}

हालाँकि मुझे लगता है कि आपके पास जो पहले से है वह पूरी तरह से मुहावरेदार है और संरचना आपके डेटा का पूरी तरह से वर्णन करती है जो सादे ट्यूल का उपयोग करने पर एक बड़ा फायदा है।

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