尝试将字符串转换为实例变量

我是 GO 语言的新手。尝试通过构建真实的 Web 应用程序来学习 GO。我正在使用 Revel 框架。


这是我的资源路线:


GET     /resource/:resource                     Resource.ReadAll

GET     /resource/:resource/:id                 Resource.Read

POST    /resource/:resource                     Resource.Create

PUT     /resource/:resource/:id                 Resource.Update

DELETE  /resource/:resource/:id                 Resource.Delete

例如:


GET /resource/users 电话 Resource.ReadAll("users")


这是我的资源控制器(现在只是一个虚拟操作):


type Resource struct {

    *revel.Controller

}


type User struct {

    Id int

    Username string

    Password string

}


type Users struct {}


func (u Users) All() string {

        return "All"

}


func (c Resource) ReadAll(resource string) revel.Result {

    fmt.Printf("GET %s", resource)

    model := reflect.New(resource)

    fmt.Println(model.All())

    return nil

}

我正在尝试通过将资源字符串转换为对象来调用All函数来获取用户结构的实例。


和错误:


不能使用资源(类型字符串)作为类型reflect.Type in参数来reflect.New:字符串没有实现reflect.Type(缺少Align方法)


我是 GO 新手,请不要评判我 :)


HUH函数
浏览 137回答 1
1回答

忽然笑

你的问题在这里:model := reflect.New(resource)您不能以这种方式从字符串实例化类型。您需要在那里使用开关并根据型号执行操作:switch resource {case "users":    model := &Users{}    fmt.Println(model.All())case "posts":    // ...}或者reflect正确使用。就像是:var types = map[string]reflect.Type{    "users": reflect.TypeOf(Users{}) // Or &Users{}.}// ...model := reflect.New(types[resource])res := model.MethodByName("All").Call(nil)fmt.Println(res)
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Go