为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

Go
HUH函数 2021-11-08 10:21:17
我是 GO 语言的新手。尝试通过构建真实的 Web 应用程序来学习 GO。我正在使用 Revel 框架。这是我的资源路线:GET     /resource/:resource                     Resource.ReadAllGET     /resource/:resource/:id                 Resource.ReadPOST    /resource/:resource                     Resource.CreatePUT     /resource/:resource/:id                 Resource.UpdateDELETE  /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 新手,请不要评判我 :)
查看完整描述

1 回答

?
忽然笑

TA贡献1806条经验 获得超5个赞

你的问题在这里:


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)


查看完整回答
反对 回复 2021-11-08
  • 1 回答
  • 0 关注
  • 136 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信