1

まず、Long Polling 通知システムを作りたいと思います。具体的には http リクエストを行い、マップチャンネルが の場合のみレスポンスが返ってきますtrue

これは私が使用したコードブロックです:

var MessageNotification = make(map[string]chan bool, 10)

func GetNotification(id int, timestamp int) notification {
    <-MessageNotification["1"]

    var chat_services []*models.Chat_service
    o := orm.NewOrm()

    _, err := o.QueryTable("chat_service").Filter("Sender__id", id).RelatedSel().All(&chat_services)

    if err != nil {
        return notification{Status: false}
    }
    return notification{Status: true, MessageList: chat_services}
}

func SetNotification(id int) {
    MessageNotification[strconv.Itoa(id)] <- true
}

これはコントローラブロックです:

func (c *ChatController) Notification() {

data := chat.GetNotification(1,0)

c.Data["json"] = data
c.ServeJSON()

  }


func (c *ChatController) Websocket(){


    chat.SetNotification(1)

    c.Data["json"] = "test"
    c.ServeJSON();

}

テスト用に作成された関数名と変数。

エラーは発生しませんでした。ご協力いただきありがとうございます。

4

1 に答える 1

0

あなたは自分のチャンネルを作成していません。

var MessageNotification = make(map[string]chan bool, 10)

この行は容量 10 のマップを作成しますが、マップ内に実際のチャネルを作成していません。その結果、`SetNotification["1"] は nil チャネルであり、nil チャネルでの送受信は無期限にブロックされます。

入れる必要があります

MessageNotification["1"] = make(chan bool)

必要に応じてサイズを含めることができます(マップの「10」は、そのチャネルのバッファリングになるはずだったという予感があります)。これは条件付きで行うこともできます:

func GetNotification(id int, timestamp int) notification {
    if _, ok := MessageNotification["1"]; !ok { // if map does not contain that key
        MessageNotification["1"] = make(chan bool, 10)
    }

    <-MessageNotification["1"]
    // ...
}

func SetNotification(id int) {
    if _, ok := MessageNotification[strconv.Itoa(id)]; !ok { // if map does not contain that key
        MessageNotification[strconv.Itoa(id)] = make(chan bool, 10)
    }

    MessageNotification[strconv.Itoa(id)] <- true
}

このようにして、チャネルにアクセスしようとする最初の場所がマップに追加され、適切にチャネルが作成されるため、チャネルでの送受信が実際に機能します。

于 2016-07-26T15:46:00.103 に答える