I have structs with duplicate fields and duplicate code to go along with 
them.  The problem is that the duplicate code does make use of non-common 
fields.  Here is an example of the code.

https://play.golang.org/p/IkoNJTdoVLD

I could extract the duplicate code sections into a method, eliminating the 
duplication.  The problem is that not all of the fields are the same.

If I had two separate function to deal with the non-common field usage and 
I could pass the respective helper into the extracted function (with the 
common-code) for it to invoke when it's time for the non-common code to 
execute, then that would be ideal.  Is there some way to do this?

On Wednesday, September 12, 2012 at 2:04:27 AM UTC-7 rog wrote:

> It's worth setting aside an hour and having a good
> read of the relevant sections of the Go specification.
> It's one of the more complex bits of the spec, but it's
> still not hard and you'll get a much better idea of the
> things you can do with embedding.
>
> http://golang.org/ref/spec#Selectors
> http://golang.org/ref/spec#Struct_types
>
>
> On 12 September 2012 03:01, beatgammit <beatg...@gmail.com> wrote:
> > Huh, I didn't know that embedding could be done for types to bring their
> > implementations along.
> >
> > Could I do something like this then:
> >
> > type DBModule struct {}
> > func (DBModule) Settings() map[string]string
> > func (DBModule) Set(string, string)
> >
> > type ModA struct {
> > *DBModule
> > }
> > func (a *ModA) Id() string {return "ModA"}
> > func (a *ModA) Format(r io.Reader) io.Reader { return r }
> >
> > Would that still implement the Module interface (i.e. pull in DBModule's
> > methods)? If so, that would save on the code reuse problem that I'm 
> having.
> > My modules are pretty easy to categorize into types (some use the DB and
> > some don't), so this means I can get rid of my hacky way of doing 
> things...
> >
> > BTW, it's more like 100+ lines of duplication without my hack, so it is
> > substantial.
> >
> > Thanks!!
> >
> > On Tuesday, September 11, 2012 7:48:28 PM UTC-6, Jesse McNelis wrote:
> >>
> >> On Wed, Sep 12, 2012 at 11:21 AM, beatgammit <beatg...@gmail.com> 
> wrote:
> >> > I've thought about how to re-architect it to avoid the problem, but
> >> > I haven't been able to come up with anything that doesn't require a 
> lot
> >> > of
> >> > code duplication or global functions.
> >>
> >> When people say "a lot of code duplication" they often mean a few lines.
> >> Go doesn't have global functions, it just has package level functions.
> >>
> >> Functions are one of the major ways to reuse code in Go. You define
> >> some types that satisfy
> >> some interface and then you write functions that act on that interface.
> >>
> >> If you have some similar fields in structs that you need to access,
> >> embedding
> >> (http://golang.org/doc/effective_go.html#embedding) can be helpful in
> >> reducing duplication
> >> of Get/Set style methods.
> >>
> >> I'm still not sure what you're trying to do, but your format() method
> >> seems like it would be better if your type was an io.Reader and
> >> format() was instead a function that took an io.Reader and returned
> >> your type.
> >>
> >>
> >>
> >>
> >>
> >> --
> >> =====================
> >> http://jessta.id.au
>

-- 
You received this message because you are subscribed to the Google Groups 
"golang-nuts" group.
To unsubscribe from this group and stop receiving emails from it, send an email 
to golang-nuts+unsubscr...@googlegroups.com.
To view this discussion on the web visit 
https://groups.google.com/d/msgid/golang-nuts/caadc8cd-fb05-4b71-9a4c-ab7a649eaa84n%40googlegroups.com.

Reply via email to