所以,我試圖構建一個websocket服務器。我遇到了這個有趣的bug,我不知道爲什麼它會發生。GO - 函數返回後代碼停止執行
注:的評論在代碼片段在那裏只爲這個職位。 閱讀它們。
Ive得到了這樣的功能:
func Join(ws *websocket.Conn) {
Log.Connection(ws)
enc := json.NewEncoder(ws)
dec := json.NewDecoder(ws)
var dJ g.DiscussionJoin
var disc g.Discussion
Log.Err(dec.Decode(&dJ), "dec.Decode")
ssD := g.FindDiscussionByID(dJ.DiscussionID)
ssDJ := dJ.Convert(ws)
g.DiscHandle <- &ssDJ
disc = ssD.Convert()
Log.Err(enc.Encode(disc), "enc.Encode")
Log.Activity("Discussion", "Joined", disc.DiscussionID.Subject)
fmt.Println("Listening") //This gets called
g.Listen(dec)
fmt.Println("Stoped Listening") //This DOESN'T get called [IT SHOULD]
ssDJ.SSDiscussion.Leave(ssDJ.SSUserID)
Log.Disconnection(ws)
}
功能那造成這是(在我看來)g.Listen(...):
func Listen(dec *json.Decoder) {
timeLastSent := time.Now().Second()
in := Message{}
for ((timeLastSent + ConnTimeout) % 60) != time.Now().Second() {
if err := dec.Decode(&in); err != nil {
continue
} else if in == Ping {
timeLastSent = time.Now().Second()
continue
}
timeLastSent = time.Now().Second()
Messages <- in
in = Message{}
}
fmt.Println("Client timed out!") //This gets called
return
}
伊夫嘗試都與不返回的最後一行聽取
至於響應@SimoEndre,我已經離開了主要方法在代碼示例中,但是自從您提到它之後,這是將g.Messege {}帶出Messeges通道的函數。
注意: MessageHandler()運行自己的去例程。
func MessageHandler() {
for msg := range Messages {
for _, disc := range LivingDiscussions {
if disc.DiscussionID.UDID == msg.UDID {
go disc.Push(msg)
break
}
}
}
}
'Messages {}'輸出在哪裏?我沒有看到它在某處實施 –
@SimoEndre現在如何?我設法粘貼錯誤的代碼片段。 – Olian04
看看大頭釘的痕跡,看看每個goroutine被阻擋的位置 – JimB