2012-11-16 33 views
19

在GOLANG中是否有一種簡單的方法可以爲跨渠道的多態行爲投射結構?我試圖通過一個通道發送一個結構體的不同版本,所以例如我將有不同類型的事件,比如LoginEvent。每個人在結構中都有不同數量的數據。有沒有方法通過通道發送Structs

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結構應該是一個接口。

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對象,並可以做一個類型斷言,看看有什麼 具體類型,強調它:

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

    switch evt.(type) { 
    case *LoginEvent: 

    case *UserEvent: 

    .... 
    } 
} 
相關問題