You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何向Gorilla Mux路由端点传递多个参数?及路由配置报错问题咨询

如何向Gorilla Mux路由端点传递多个参数?及路由配置报错问题咨询

嘿,你遇到的这个报错其实和路由里的参数数量没啥关系,核心问题出在Go语言的包导出规则上!

先解释报错原因

Go语言有个严格的规则:只有首字母大写的标识符(包括函数、变量、结构体等)才能被其他包访问。你现在看到的cannot refer to unexported name controllers.GetProducts,说明你在controllers.go里定义的GetProducts函数是小写开头的(比如getProducts),这样main包就没法引用它,自然就报错了。

再说说你的路由写法

你写的路由规则/products/{expiry_date}/{brand}/{quality_rating}是完全符合Gorilla Mux规范的,这个写法没问题,多个路径参数的定义方式就是这样的。只要后续在函数里能正确获取参数就行。

具体解决步骤

  1. 修正控制器函数的导出权限
    打开controllers.go,确保GetProducts函数的首字母是大写的,比如:
    package controllers
    
    import (
        "net/http"
        "github.com/gorilla/mux"
    )
    
    func GetProducts(w http.ResponseWriter, r *http.Request) {
        // 获取路径参数:Go 1.21及以上版本可以用PathValue
        expiryDate := r.PathValue("expiry_date")
        brand := r.PathValue("brand")
        qualityRating := r.PathValue("quality_rating")
    
        // 如果是Go 1.21以下版本,用mux.Vars来获取
        // vars := mux.Vars(r)
        // expiryDate := vars["expiry_date"]
    
        // 这里写你的业务逻辑
    }
    
  2. 确认包导入正确
    确保main包已经正确导入了controllers包,导入路径要和你的项目结构匹配,比如:
    import (
        "net/http"
        "your-project-path/controllers"
        "github.com/gorilla/mux"
    )
    

额外小提示

如果你的参数有特定格式要求(比如expiry_date是日期格式),可以给参数加匹配规则,避免路由匹配错误,比如:

r.HandleFunc("/products/{expiry_date:[0-9-]+}/{brand}/{quality_rating:[0-9]+}", controllers.GetProducts).Methods("GET","OPTIONS")

这样就限制了expiry_date只能是数字加横杠的格式,quality_rating只能是数字,让路由匹配更精准。

备注:内容来源于stack exchange,提问作者John Scott

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.04.23 12:22:37