Опит за преобразуване на низ в променлива на екземпляр

Нов съм в езика GO. Опитвате се да научите 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
}

Опитвам се да получа екземпляр на Users struct, като преобразувам ресурен низ в обект, за да извикам функцията All.

и грешката:

не може да използва ресурс (тип низ) като тип отразяване. Въведете аргумент за отразяване. Ново: низът не прилага отразяване. Тип (липсващ метод за подравняване)

Нов съм в GO, моля, не ме съдете :)


person num8er    schedule 07.09.2015    source източник
comment
Това ли се опитваш да направиш? stackoverflow.com/questions/23030884/   -  person ANisus    schedule 07.09.2015


Отговори (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)
person Ainar-G    schedule 07.09.2015
comment
ето как изглежда моят код сега: joxi.ru/0KAgEEehM0QWml и грешката: joxi.ru/9E2pMMKFz0lZAY - person num8er; 07.09.2015
comment
Това все още няма да работи, защото не можете да извиквате методи на interface{} (защото няма методи). Все пак ще трябва да го напишете assert, за да го направите по този начин, и ако искате, няма смисъл да се опитвате да създавате тип от низ. Това е нещо, което би работило добре на динамичен език, а не на Go. - person Ainar-G; 07.09.2015