code: func (e *Environment) Go(f func(ctx context.Context) error) {
  	e.mu.RLock()
  	if e.stopped {
  		e.mu.RUnlock()
  		return
  	}
  	e.wg.Add(1)
  	e.mu.RUnlock()
  
  	go func() {
  		ctx, cancel := context.WithCancel(e.ctx)
  		defer cancel()
  		err := f(ctx)
  		if err != nil {
  			e.Cancel(err)
  		}
  		e.wg.Done()
  	}()
  }
docs: // Go starts a goroutine that executes f.
  //
  // f takes a drived context from the base context.  The context
  // will be canceled when f returns.
  //
  // Goroutines started by this function will be waited for by
  // Wait until all such goroutines return.
  //
  // If f returns non-nil error, Cancel is called immediately
  // with that error.
  //
  // f should watch ctx.Done() channel and return quickly when the
  // channel is closed.