2014-07-10 30 views
0

我有一個問題,使用此語句傳遞一個結構來一個帖子馬提尼例行

m.Post(Model, binding.Form(Wish), func(wish Wish, r render.Render, db *mgo.Database) { 

這工作得很好,如果我使用該結構的前衛裏面這樣定義

m.Post(Model, binding.Form(Wish1{}) , func(wish Wish1, r render.Render, db  *mgo.Database) { 

,但我需要這成爲一個獨立的包。 我得到「願望不是一個類型」希望是綁定函數的返回。 這與一個主要的類型結構。我通過接口作爲接口{}

我正在使用GO和Martini.Classic()對於我來說,改變馬提尼或綁定包真的很複雜。有什麼建議麼。

這是所有代碼

package chlistpkg 
import (
    "github.com/codegangsta/martini" 
    "github.com/codegangsta/martini-contrib/binding" 
    "github.com/codegangsta/martini-contrib/render" 
    "labix.org/v2/mgo" 
    "time" 
    "fmt" 
    "html/template" 
    "reflect" 
    "adminStruct" 
) 

只是爲了顯示我需要通過以常規的doall

type Wish1 struct { 
    Name  string `form:"name"` 
    Description string `form:"description"` 
    AnyDate  time.Time `form:"anydate"` 
    Active  bool `form:"active"` 
    Number  int `form:"number"` 
    NumDec  float32 `form:"numDec"` 
} 

DB返回martini.Handler

func DB() martini.Handler { 
    session, err := mgo.Dial("mongodb://localhost") 
    if err != nil { 
     panic(err) 
    } 

return func(c martini.Context) { 
    s := session.Clone() 
    c.Map(s.DB("advent2")) 
    defer s.Close() 
    c.Next() 
} 

的結構}

GetAll返回數據庫中的所有願望

func GetAll(db *mgo.Database, entList interface{}) interface{} { 
    db.C("wishes").Find(nil).All(entList) 
    fmt.Println("GettAll entList =", entList) 
    return entList 
} 


    func Doall(Model string, Wish interface{}, Wish2 interface{}, Wishlist interface{}  ) { 
    m := martini.Classic() 
    fmt.Println ("martini.Classic =", m) 
    m.Use(martini.Static("images")) // serve from the "images" directory as well 

    m.Use(render.Renderer(render.Options{ 
     Directory: "templates", 
     Layout: "layout", 
     })) 

    m.Use(DB()) 

    m.Get(Model, func(r render.Render, db *mgo.Database) { 
    r.HTML(200, "lista4", GetAll(db, Wishlist)) 
    }) 

綁定不帶指針。我必須通過引用傳遞的結構上的「願望」 問題是「願望願望」的回報,我得到了一個錯誤的願望是不是在編譯時類型 提前

m.Post(Model, binding.Form(Wish), func(wish Wish, r render.Render, db *mgo.Database) { 
fmt.Println("Input wish =", wish) 
db.C("wishes").Insert(wish) 
r.HTML(200, "lista4", GetAll(db, Wishlist)) 
}) 

m.Run() 

感謝

Luis

+0

你可以發佈錯誤所指的行嗎?你的代碼有很多錯誤。 – elithrar

回答

0

你得到一個錯誤的原因是你已經調用了你的類型Wish1(數字爲1),但你指的是代碼中的Wish類型(它不存在!)。

改變你的結構是:

// Note: "Wish", not "Wish1" 
type Wish struct { 
    Name  string `form:"name"` 
    Description string `form:"description"` 
    AnyDate  time.Time `form:"anydate"` 
    Active  bool `form:"active"` 
    Number  int `form:"number"` 
    NumDec  float32 `form:"numDec"` 
} 

如果你想要把你的類型到另一個包(提示:不要過分的子包),那麼它將需要成爲一個pkgname.Wish姓名是完全合格的。

新增

第二次看後,你也搞亂的東西在這裏:

func Doall(Model string, Wish interface{}, Wish2 interface{}, Wishlist interface{}  ) { 
    m := martini.Classic() 
    fmt.Println ("martini.Classic =", m) 
    m.Use(martini.Static("images")) // serve from the "images" directory as well 

你的參數列表需要爲每個類型的名稱;您無法將Wish interface{}作爲參數傳遞,因爲Wish是一種類型,而不是變量名稱。

您應該:

func DoAll(model string, wish interface{}, wish2 interface{}, wishList interface{}) { ... } 

或者更好的是,停止使用interface{}這樣寫:

func DoAll(model string, wishList []Wish, wishes... Wish) { ... } 

但是,你DoAll功能似乎並沒有在其他地方引用,並且是創建自己的Martini實例。如果你剛剛起步,我強烈建議你想一想爲什麼事情會像這樣「分手」。保持簡單 - 例如

func main() { 
    m := martini.Classic() 
    m.Use(martini.Static("images")) 
    m.Use(DB()) 
    m.Use(render.Renderer(render.Options{...})) 
    // No need for an anonymous function, which just adds clutter 
    m.Get("/wishes/all", GetAllWishes) 
    // Same goes for here 
    m.Post("/wishes/new", PostWish) 

    m.Run() 
} 

PS:我已經修復了代碼的格式,因爲它在括號之前/之後有很多不必要的間距。請確保使用gofmt,它包含在Go安裝中,可以掛接到最受歡迎的編輯器中。

+0

好吧,它看起來像是將類型結構體封裝到包中的唯一方式是使用上面提到的「pkgname.Wish」。感謝你的回答。 – user3715287

相關問題