Попытка преобразовать строку в переменную экземпляра

Я новичок в языке 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 путем преобразования строки ресурса в объект для вызова функции All.

и ошибка:

нельзя использовать ресурс (строка типа) как тип Reflect.Type в аргументе для Reflect.New: строка не реализует Reflect.Type (отсутствует метод Align)

Я новичок в 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