> Can you just have a field of your Context type be a value of type 
> context.Context? 
>
> Ian 
>

I managed to do this eventually. The confusion was that my library has 
multiple types of contexts and they need to be stacked in any particular 
order. So at first, the values from previous (parent) contexts did not seem 
to transfer well to the child contexts. When looking at the context.Context 
source code to learn how it does that, I was surprised to learn that it 
propagates those cancellation signals down to its children manually, which 
is yucky.

What I ended up doing is create another Context interface for my package 
that has all the functions I need. Create a parent struct that implements 
those functions with empty features. Then each feature context can overload 
those functions as needed.

package yourpackage

import "context"

type Context interface{
    context.Context
    FeatureX() *X
    FeatureY() *Y
    FeatureZ() *Z
}

type BasicContext struct {
    context.Context
}

func (ctx *BasicContext) FeatureX() *X {
    return nil;
}

func WithBasicContext(parent context.Context) Context {
    return &BasicContext{Context: parent}
}

type featureXContext struct {
    Context
    x *X
}

func (ctx *featureXContext) FeatureX() *X {
    return ctx.x
}

func WithFeatureX(parent Context, x *X) Context {
    return &featureXContext{Context: parent, x: x}
}

It seems to be functioning as expected, and compatible with the other 
contexts like WithDeadline or WithTimeout.

-- 
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.
For more options, visit https://groups.google.com/d/optout.

Reply via email to