2012-11-16 23 views
19

GOLANG में भेजने के लिए Structs कास्ट करने के लिए एक तरह से वहाँ चैनलों में बहुरूपी व्यवहार के लिए structs कास्ट करने के लिए जिस तरह से करने के लिए एक आसान है? मैं एक चैनल के पार एक struct के विभिन्न संस्करणों को भेजने के लिए कोशिश कर रहा हूँ, तो उदाहरण के लिए मैं घटनाक्रम के विभिन्न प्रकार के लिए जा रहा हूँ, एक LoginEvent की तरह। हर एक struct में डेटा के विभिन्न मात्रा में होगा।वहाँ एक चैनल

package main 

import "fmt" 


type Event struct { 
    EvtType EvtType 
    Username string 
    Data string 
} 


type LoginEvent struct { 
    Event 
    CallBackChannel chan *Event 
} 


type EvtType int 

const (
    Login EvtType = iota+1 
    Logout 
    ChatMessage 
    Presense 
    BuddyList 
) 


func main() { 
    fakeOutputChan := make(chan<- *Event) 

     ourSrvChannel := make(chan *Event) 
     lg := (LoginEvent{Event{Login,"",""} ,ourSrvChannel}) 
    fakeOutputChan <- (*Event)(&lg) 

    fmt.Println("Hello, playground") 
} 

उत्तर

24

इंटरफ़ेस का उपयोग करने के लिए बेवकूफ तरीका है, और प्राप्त करने वाले अंत में एक प्रकार का दावा करना है। आपका Event struct आदर्श एक इंटरफेस होना चाहिए।

type Event interface { 
    // Methods defining data all events share. 
} 

type UserEvent struct { 
    Name string 
} 

// Define methods on *UserEvent to have it qualify as Event interface. 

type LoginEvent struct { 
    ... 
} 

// Define methods on *LoginEvent to have it qualify as Event interface. 

तो फिर तुम कुछ भी है कि Event इंटरफेस के रूप में उत्तीर्ण स्वीकार करने के लिए अपने चैनल को परिभाषित कर सकते हैं।

ch := make(chan Event) 

प्राप्त अंत Event वस्तुओं प्राप्त होगा और क्या ठोस प्रकार यह underlies को देखने के लिए एक प्रकार का दावा कर सकते हैं:

select { 
case evt := <- ch: 
    if evt == nil { 
     return 
    } 

    switch evt.(type) { 
    case *LoginEvent: 

    case *UserEvent: 

    .... 
    } 
}