首页 > 解决方案 > 了解 Golang 中的频道

问题描述

我有一个简单的代码,它接收一个对象并将其广播到所有连接的客户端,但是当我尝试写入它并且执行 <- 对通道没有任何作用时,通道会阻塞。这是相关代码:

package Server

import (
    "bytes"
    "encoding/gob"
    "log"
    "net"
)
import "fmt"

type defaultMethod = func () (interface{}, error)

type CoreServer struct {
    methods     map[string]defaultMethod
    translation []string

    event  chan Event
    method map[net.Conn]chan defaultMethod
    stop   chan bool
}

type Event struct {
    Description string
}

func (cs *CoreServer) RaiseEvent(raisedEvent Event) {
    fmt.Println("Before")
    cs.event <- raisedEvent
    fmt.Println("After")
}

func (cs *CoreServer) eventTrigger(socket net.Conn) {
    for true {
        fmt.Println("Waiting...")
        event := <- cs.event
        fmt.Println("Done Waiting")
        var data []byte

        data = append(data, 0x2)
        data = append(data, []byte(event.Description)...)

        socket.Write(data)
    }
}

func (cs *CoreServer) client(socket net.Conn) {
    cs.method[socket] = make(chan defaultMethod)

    cs.handshake(socket)

    // start receive thread
    go cs.inboundTraffic(socket)

    // start send threads
    go cs.methodInvocation(socket)
    go cs.eventTrigger(socket)

    <- cs.stop
    fmt.Println("EXITING")
}

这里唯一的输出是Before,然后当客户端加入时(客户端函数在 goroutine 中执行)输出是Waiting...并且事件 goroutine 停止,是否有一些我没有看到或理解的明显问题?

标签: gotcpchannelgoroutine

解决方案


推荐阅读