如何向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规范的,这个写法没问题,多个路径参数的定义方式就是这样的。只要后续在函数里能正确获取参数就行。
具体解决步骤
- 修正控制器函数的导出权限
打开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"] // 这里写你的业务逻辑 } - 确认包导入正确
确保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
相关产品推荐
相关产品推荐

