2016-07-14 4 views
1

Я пытаюсь реализовать абстракцию golang Я использую gorm библиотеку ОРМ и gin рамкиGolang абстракции в обработчике, чтобы избежать дублирования кода

Базовый класс

type Base struct { 
    Context *gin.Context // Passing gin request 
} 

func (b *Base) Add() { 
    err := b.Context.BindJSON(b) 
    if err != nil { 
    // handling error here 
    } 
    gorm.db.Create(b) // Here I am adding base data to database 
} 

Детский класс

type Shopper struct { 
    Base // Embedding Base struct 
    Name string, 
    Address string, 
    ContactNo int 
} 

Handler

func handler (c *gin.Context) { 
    s := new(Shopper) 
    s.Context = c 
    s.Add() // Here I am expecting Add() method should bind JSON to shopper struct 
      // entry to database using gorm 
} 

Add() метод не принимает какого-либо имущества, которое shopper структура имеет.

Здесь я просто хочу, чтобы избежать code duplication в каждом handler который просто берет из JSON тела запроса и добавить к соответствующему database с помощью gorm

ответ

2

Вы не можете, потому что Go does not have inheritance.

Повторяю: Go не имеет наследства, поэтому, пожалуйста, отмените это «базовое» и «детское» при работе с Go.

Причина ваш код не работает в том, что в то время как метод набора встроенный тип действительно «поднял» и сливались в метод установить типа, который встраивает его, когда любой из таких методов называется его приемником является значение встроенного типа, а не значение прилагаемого типа.

IOW ваш метод Add() всегда принимает значения типа Base

Если тип вшита имеет метод, который имеет такое же имя как метод встроенного типа, и вы называете такой метод по значению который будет называться методом закрытого типа . Так что нет перегрузки, но, если хотите, есть «переопределение».

Что мне нужно делать в вашей ситуации перестать думать в ООП и написал функцию, а не метод (непроверенный):

func add(any interface{}, ctx *gin.Context) { 
    err := ctx.BindJSON(any) 
    if err != nil { 
    // handling error here 
    } 
    gorm.db.Create(any) // Here I am adding base data to database 
} 

Тогда в обработчике:

func handler (c *gin.Context) { 
    s := new(Shopper) 
    s.Context = c 
    add(s, c) 
} 
+0

спасибо kostix –