Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/go/7.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Go 组织路线和助手_Go - Fatal编程技术网

Go 组织路线和助手

Go 组织路线和助手,go,Go,我开始在go(golang)中构建api,但我有几个问题 所以在我的main函数或init函数中(因为我可能使用appengine),我考虑调用一个函数,该函数将使用gorilla mux定义我的所有路由。我的应用程序的每个图片(帖子、评论等)都有一个包含其结构/方法/功能的包 问题: 因为我想在一个函数中定义路由,所以我是否需要在这个文件中导入我的所有包,以便将请求发送到正确的处理程序 关于helper函数,例如,我想将响应的内容类型设置为application/json,对于所有需要这样做的

我开始在go(golang)中构建api,但我有几个问题

所以在我的main函数或init函数中(因为我可能使用appengine),我考虑调用一个函数,该函数将使用gorilla mux定义我的所有路由。我的应用程序的每个图片(帖子、评论等)都有一个包含其结构/方法/功能的包

问题:

  • 因为我想在一个函数中定义路由,所以我是否需要在这个文件中导入我的所有包,以便将请求发送到正确的处理程序

  • 关于helper函数,例如,我想将响应的
    内容类型设置为
    application/json
    ,对于所有需要这样做的处理程序,我将如何做到这一点


  • 我不是在寻找框架,只是一些关于如何以golang方式克服这些问题的指针。

    如果在单个函数中定义所有路由,那么包含此函数的文件将需要导入实现处理程序的包。在另一个包中引用类型或函数的唯一方法是导入该包

    下面是一个帮助程序,用于设置内容类型并将值编码为JSON:

    func JSONHandler(f func(w http.ResponseWriter, r *http.Request) interface{}) http.Handler {
      return http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
        v := f(w, r)
        if v != nil {
            w.Header().Set("Content-Type", "application/json")
            if err := json.NewEncoder(w).Encode(v); err != nil {
                log.Println(err)
            }
        }
      })
    }
    
    此函数的参数是一个函数,它返回一个值,并将其编码为JSON。例如,此函数以JSON的形式返回客户端的用户代理

    func UserAgentHandler(w http.ResponseWriter, r *http.Request) interface{} {
      return struct { UserAgent string }{ req.Header.Get("User-Agent") }
    }
    
    使用以下代码向Gorilla mux注册此处理程序
    r

    r.Handle("/user-agent", JSONHandler(UserAgentHandler))
    

    改进JSONHandler的方法有很多。

    我认为您可能需要从一个类似于
    main
    的包调用
    Register
    ,该包导入所有包含包的视图(并且不是由它们导入的),甚至从各种包的
    init()
    调用(但是,我看到了在一个地方组织路由的吸引力)。如果您的帖子/评论/等视图紧密集成,则应用程序的大小不超过一定大小,它们可能不需要是不同的软件包。下面是我对包布局相关问题的回答:JSON内容类型/编码基本上是一个实用函数,可以由定义视图的包导入。所以:路径在“顶部”,utils在“底部”。实际上,有一篇关于这方面的博文(比如“我们如何使用无框架的Go”)涵盖了它们如何处理这一点和其他一些小事情;但是我找不到。如果有人能找到“我们如何使用无框架”的帖子,我将永远爱你。我记得他们编写了自己的包装器来执行JSON en/解码,但我现在真的找不到。