返回顶部
首页 > 资讯 > 后端开发 > GO >在 REST API 中使用 Goroutine - 出现未定义的错误
  • 287
分享到

在 REST API 中使用 Goroutine - 出现未定义的错误

2024-04-04 23:04:21 287人浏览 泡泡鱼
摘要

最近发现不少小伙伴都对golang很感兴趣,所以今天继续给大家介绍Golang相关的知识,本文《在 REST api 中使用 Goroutine - 出现未定义的错误》主要内容涉及到等等知识点,希望

最近发现不少小伙伴都对golang很感兴趣,所以今天继续给大家介绍Golang相关的知识,本文《在 REST api 中使用 Goroutine - 出现未定义的错误》主要内容涉及到等等知识点,希望能帮到你!当然如果阅读本文时存在不同想法,可以在评论中表达,但是请勿使用过激的措辞~

问题内容

我正在学习 go,想要制作一个简单的 rest api。

我想要做的是在处理 api 请求后触发一个 goroutine,并在后台异步完成工作。

这是我迄今为止的实现:

package main

import (
    "encoding/JSON"
    "log"
    "net/Http"

    "GitHub.com/julienschmidt/httprouter"
)

// APIResponse represents common structure of every api call response
type APIResponse struct {
    Status string `json:"status"`
    Error  string `json:"error,omitempty"`
    Data   string `json:"data,omitempty"`
}

// Action represents what could be passed to the goroutine
type Action = func()

// ActionQueue represents a buffered channel
type ActionQueue = chan Action

func main() {
    r := httprouter.New()
    r.GET("/test", test)

    var apiServerPort = ":80"
    err := http.ListenAndServe(apiServerPort, r)
    if err != nil {
        log.Fatal("ListenAndServe:", err)
    } else {
        log.Printf("Started server on port %s", apiServerPort)
    }

    var queueSize = 10
    queue := make(ActionQueue, queueSize)
    for i := 0; i < queueSize; i++ {
        go worker(queue)
    }
    log.Printf("Started %d queue workers", queueSize)
}

func test(w http.ResponseWriter, r *http.Request, p httprouter.Params) {
    successResponse(w, http.StatusOK, "Hello World")
    queue <- func() {
        log.Println("Hello from queue worker, initiated by api call")
    }
}

func successResponse(w http.ResponseWriter, statusCode int, successData string) {
    sendResponse(w, statusCode, "", successData)
}

func errorResponse(w http.ResponseWriter, statusCode int, errorData string) {
    sendResponse(w, statusCode, errorData, "")
}

func sendResponse(w http.ResponseWriter, statusCode int, errorData string, responseData string) {
    w.WriteHeader(statusCode)
    w.Header().Set("Content-Type", "application/json")
    json.NewEncoder(w).Encode(&APIResponse{Status: http.StatusText(statusCode), Error: errorData, Data: responseData})
}

func worker(queue ActionQueue) {
    for action := range queue {
        action()
    }
}

当我尝试运行此代码时,出现以下错误(在这一行 queue <- func() { ... }):

./main.go:46:2:未定义:队列

如何使 queue 通道可供我的请求处理程序(即 httprouter get 请求处理程序函数)使用?

其次,我在控制台输出(stdout)中看不到 log.printf() 调用的输出,例如应用程序运行时的服务器状态消息。有什么想法吗?


解决方案


有几个地方是错误的,首先你的 main 函数没有正确排序,你想在运行 err := http.listenandserve(apiserverport, r) 之前初始化你的通道并启动工作线程,所以像这样

func main() {
    var queuesize = 10
    queue := make(actionqueue, queuesize)
    for i := 0; i < queuesize; i++ {
        go worker(queue)
    }
    log.printf("started %d queue workers", queuesize)

    // routers and stuff...
}

然后 queue 变量未在 test() 函数中定义,这就是为什么您得到 ./main.go:46:2: undefined:queue。您可以使用更高阶的函数来修复它,例如

func test(queue ActionQueue) httprouter.Handle {
    return func(w http.ResponseWriter, r *http.Request, p httprouter.Params) {
        successResponse(w, http.StatusOK, "Hello World")
        queue <- func() {
            log.Println("Hello from queue worker, initiated by api call")
        }
    }
}

然后只需使用 r.get("/test", test(queue)) 将其绑定到路由

今天关于《在 REST API 中使用 Goroutine - 出现未定义的错误》的内容就介绍到这里了,是不是学起来一目了然!想要了解更多关于的内容请关注编程网公众号!

您可能感兴趣的文档:

--结束END--

本文标题: 在 REST API 中使用 Goroutine - 出现未定义的错误

本文链接: https://lsjlt.com/news/596100.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

猜你喜欢
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作