gpt4 book ai didi

data-binding - 将结构传递给 Post martini 例程

转载 作者:数据小太阳 更新时间:2023-10-29 03:29:09 25 4
gpt4 key购买 nike

我在使用这个语句时遇到问题

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

如果我在 prog 中使用 struct define 就可以正常工作

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

但我需要它是一个独立的包。我得到“Wish is not a type”希望是绑定(bind)函数的返回。这适用于主要类型结构。我将支柱作为接口(interface)传递{}

我正在使用带有 Martini.Classic() 的 GO 更改 Martini 或 Binding 包对我来说真的很复杂。任何建议。

这是全部代码

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 返回数据库中的所有 Wishes

 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))
})

绑定(bind)不采用指针。我必须在“Wish”上通过引用传递结构问题是“wish Wish”的返回我得到一个错误 Wish is not a type在编译时

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()

提前致谢

路易斯

最佳答案

您收到错误的原因是您调用了您的类型 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 安装中,可以连接到大多数流行的编辑器。

关于data-binding - 将结构传递给 Post martini 例程,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24685338/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com