2015-09-07 4 views
0

Я новичок в языке GO. Попытка узнать GO путем создания реального веб-приложения. Я использую revel framework.Пытается преобразовать строку в переменную экземпляра

А вот мои ресурсные маршруты:

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.ReadAll ("пользователи")

И это мой контроллер ресурсов (это всего лишь фиктивные действия на данный момент):

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 
} 

Я пытаюсь получить экземпляр пользователей struct путем преобразования строка ресурса Объект для вызова Все функция.

и ошибка:

cannot use resource (type string) as type reflect.Type in argument to reflect.New: string does not implement reflect.Type (missing Align method)

Я новичок в GO, пожалуйста, не судите меня :)

+3

Это то, что вы пытаетесь сделать? http://stackoverflow.com/questions/23030884/is-there-a-way-to-create-an-instance-of-a-struct-from-a-string – ANisus

ответ

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) 
+0

Вот как выглядит мой код сейчас: http : //joxi.ru/0KAgEEehM0QWml и ошибка: http://joxi.ru/9E2pMMKFz0lZAY – num8er

+1

Это все еще не работает, потому что вы не можете вызывать методы на 'interface {}', (потому что у него нет методов). Вам все равно нужно будет [type assert] (http://golang.org/ref/spec#Type_assertions) сделать это таким образом, и если вы это сделаете, нет смысла пытаться создать экземпляр типа из строки , Это то, что будет хорошо работать на динамическом языке, а не в Go. –

+0

большое спасибо! Сделал его с помощью переключателя. – num8er

Смежные вопросы