2016-02-21 3 views
0

Скажем, у меня есть struct, что я связываю json Param данные нравитсяСоздание интерфейса для JSON структуры в golang

type User struct { 
    FirstName string `json:"firstName"` 
} 

Атрибут FirstName должен быть капитализированы таким образом, чтобы json значения могут быть переплетены в структуры ,

Но я также хочу создать interface, чтобы принять любые struct, который имеет атрибут FirstName. Поскольку FirstName уже заглавны и взяты, я должен назвать метод что-то еще.

type NameInterface interface { 
    FirstName() string // nope 
    FirstNameValue() string // maybe? 
} 

Но, кажется, действительно странно, чтобы добавить вспомогательную функцию для каждого атрибута на всех моих jsonstruct с только, чтобы они могли работать с interface. Есть ли что-то, что я недопонимаю, или шаблон программирования, который мне не хватает? Каков наилучший способ получить jsonstruct для работы с interfaces в go?

Больше (то, что я пытаюсь сделать):

Я хочу, чтобы разобрать json Params, которые идут от моего controllers в structs. Затем передайте данные struct в filters, которые затем запускают команды sql для фильтрации данных на основе данных параметров. Я хотел использовать interfaces, поэтому могу перейти в structs, созданный из разных источников, в мой filters.

+0

Вашей «Больше» информация звучит как фильтры должны работать на интерфейсах, а декодирование JSON полностью происходит на материальных структуры, которая звучит разумно, и вам не нужны JSON декодировать на интерфейсы. Может быть, вы должны показать реальный код, так как я не вижу здесь каких-либо трудностей: что не так, реализуя методы, которые ваши структуры должны соответствовать интерфейсу? – Volker

ответ

2

Интерфейсы в Go указывают поведение, но вы пытаетесь использовать их для описания данных. Вот почему вы считаете, что ваш подход будет сложным - и поэтому это, вероятно, неправильный подход.

Трудно дать более конкретный ответ, не зная, чего вы действительно пытаетесь достичь, но если вы, например, хотите иметь функции, которые могут читать определенные именованные поля из разных типов структур, Вероятно, вы хотите определить одну структуру для описания этих данных, а затем вставить эту структуру в другие типы структур.

Нечто подобное могло бы соответствовать вашим потребностям:

type Person struct { 
    FirstName string `json:"firstName"` 
} 

type User struct { 
    Person 
    // other User-specific fields 
} 

type Admin struct { 
    Person 
    // other Admin-specific fields 
} 

func Harass(p Person) { } 

func main() { 
    user := User{Person{"Frank"}} 
    Harass(user.Person) 
    admin := Admin{Person{"Angelina"}} 
    Harass(admin.Person) 
} 
+0

добавил больше информации к моему вопросу. Очень ценю ваш ответ. – Derek

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