大猩猩Mux和GORM失败

Juan Artau:

我按照本教程讲解了如何使用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()
}

但是我认为这不是正确的方法。我也尝试将这段代码移到main函数中,并且也可以工作:

tickets := []Ticket{}
db.Find(&tickets)

因此,我假设它可能var db *gormDB是未正确分配的全局变量我究竟做错了什么?

亚历克斯·瓜拉(Alex Guerra):

当您键入db, err := ...内容时,实际上是var db使用名为db的函数局部变量来隐藏全局变量,而不是分配给全局变量。您需要使用等号(=vs :=)分配给已定义的var。这也意味着您将需要var err error在赋值之前在main范围内进行编写,因为您不再从中自动获取声明:=

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章