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

时间:2015-09-07 10:48:26

标签: rest go controller resources revel

我是GO语言的新手。 试图通过构建真正的Web应用程序来学习GO。 我使用了狂欢框架。

这是我的资源路线:

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
}

我尝试通过将资源字符串转换为对象来调用所有功能来获取Users结构的实例。

和错误:

  

不能使用资源(类型字符串)作为参数中的类型reflect.Type   reflect.New:string没有实现reflect.Type(缺少对齐   方法)

我是GO的新手,请不要评价我:)。

1 个答案:

答案 0 :(得分:2)

你的问题在这里:

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)