Gorilla Mux 和 GORM 失败
Posted
技术标签:
【中文标题】Gorilla Mux 和 GORM 失败【英文标题】:Gorilla Mux and GORM fail 【发布时间】:2018-04-26 18:16:49 【问题描述】:我关注了this tutorial,了解如何使用 PostgreSQL、Gorilla Mux 和 GORM 设置基本 API。
这是我的应用程序:
package main
import (
"encoding/json"
"net/http"
"github.com/gorilla/mux"
"github.com/jinzhu/gorm"
_ "github.com/jinzhu/gorm/dialects/postgres"
)
var db *gorm.DB
type Ticket struct
gorm.Model
InfoHash string
Status *int `gorm:"default:'0'"`
func main()
router := mux.NewRouter()
db, err := gorm.Open("postgres", "host=localhost user=user dbname=db_development password=password sslmode=disable")
db.LogMode(true)
if err != nil
panic(err)
defer db.Close()
db.AutoMigrate(&Ticket)
router.HandleFunc("/", TicketsIndex).Methods("GET")
http.ListenAndServe(":3000", router)
func TicketsIndex(w http.ResponseWriter, r *http.Request)
tickets := []Ticket
db.Find(&tickets)
json.NewEncoder(w).Encode(&tickets)
问题是当我访问localhost:3000
时,服务器只是停止而没有错误日志,只是停止并退出应用程序。它应该以 JSON 格式返回存储在数据库中的票证。
如果我在我的 TicketsIndex 函数中打开数据库并关闭它,我就可以正常工作,如下所示:
func TicketsIndex(w http.ResponseWriter, r *http.Request)
db, err := gorm.Open("postgres", "host=localhost user=user dbname=db_development password=password sslmode=disable")
tickets := []Ticket
db.Find(&tickets)
json.NewEncoder(w).Encode(&tickets)
defer db.Close()
但我认为这不是正确的方法。我也尝试将此代码移动到主函数中并且也可以:
tickets := []Ticket
db.Find(&tickets)
所以我假设它可能是未正确分配的全局变量var db *gormDB
。我做错了什么?
【问题讨论】:
当您输入db, err :=
时,您将使用名为db 的函数局部变量遮蔽全局var db
,而不是分配给全局变量。您需要使用等号分配给已定义的 var。也意味着你需要在main
范围内写var err error
。
这就是我的朋友的答案,从昨天开始我一直在努力解决这个问题。写下你的答案让我接受。谢谢!
【参考方案1】:
当您键入db, err := ...
时,您实际上是在使用名为db 的函数局部变量来隐藏全局var db
,而不是分配给全局变量。您需要使用等号(=
vs :=
)分配给已定义的变量。这也意味着您需要在分配之前在主范围内编写var err error
,因为您不再自动从:=
获得声明。
【讨论】:
以上是关于Gorilla Mux 和 GORM 失败的主要内容,如果未能解决你的问题,请参考以下文章
GolangWeb 入门 08 集成 Gorilla Mux