数据争夺与xml.Marshal发生

I'm getting a strange data race reported when I use xml.Marshal on a struct. I am 99% sure that I am not sending the same variable or something like that - instead I get intermittent errors in which the marshal function believes that it is causing a data race.

Here's the code (simplified a bit but all functional elements are there):

// this is run prior to any calls being sent to the below functions
func Setup() (descriptor *serviceDescriptor) {
    descriptor = new(serviceDescriptor)

    wpChan := make(chan *Call)
    for i := 1; i < 100; i++ {
        go serviceWorker(wpChan)
    }
    descriptor.wpChan = wpChan

    return
}   

// called externally to initiate a call
func (s *serviceDescriptor) Add(c *Call) {
    go s.makeCall(c)
}

// sends a call to the worker pool set up in the Setup() function
func (s *serviceDescriptor) makeCall(c *Call) {

    cw := new(callwrapper)
    cw.internal = new(etFullCall)
    cw.internal.Calldata = c

    /// this is a channel that the next function listens to
    s.wpChan <- ct

   // the result is sent back on a channel and processed here
}

// this is a function 
func worker(wpChan chan *callwrapper) {
    for cw := range wpChan {
        v := new(Result)

        // this is where the data race occurs.    
        byt, err := xml.Marshal(cw.internal)

        // do stuff with the result down here

    }

}

Here's the error:

WARNING: DATA RACE
Write by goroutine 115:
  runtime.copy()
      /usr/lib/go/src/pkg/runtime/slice.c:120 +0x0
  encoding/xml.(*parentStack).push()
      /usr/lib/go/src/pkg/encoding/xml/marshal.go:901 +0x2bd
  encoding/xml.(*printer).marshalStruct()
      /usr/lib/go/src/pkg/encoding/xml/marshal.go:819 +0x58c
  encoding/xml.(*printer).marshalValue()
      /usr/lib/go/src/pkg/encoding/xml/marshal.go:524 +0x12a8
  encoding/xml.(*Encoder).Encode()
      /usr/lib/go/src/pkg/encoding/xml/marshal.go:153 +0x83
  encoding/xml.Marshal()
      /usr/lib/go/src/pkg/encoding/xml/marshal.go:72 +0x9d
  exacttarget.serviceWorker()
      /service.go:94 +0x20e

Previous write by goroutine 114:
  runtime.copy()
      /usr/lib/go/src/pkg/runtime/slice.c:120 +0x0
  encoding/xml.(*parentStack).push()
      /usr/lib/go/src/pkg/encoding/xml/marshal.go:901 +0x2bd
  encoding/xml.(*printer).marshalStruct()
      /usr/lib/go/src/pkg/encoding/xml/marshal.go:819 +0x58c
  encoding/xml.(*printer).marshalValue()
      /usr/lib/go/src/pkg/encoding/xml/marshal.go:524 +0x12a8
  encoding/xml.(*Encoder).Encode()
      /usr/lib/go/src/pkg/encoding/xml/marshal.go:153 +0x83
  encoding/xml.Marshal()
      /usr/lib/go/src/pkg/encoding/xml/marshal.go:72 +0x9d
  exacttarget.serviceWorker()
     /service.go:94 +0x20e

Goroutine 115 (running) created at:
  service.Setup()
     /service.go:39 +0x112
  /src.processSingleUser()
      /main_test.go:405 +0xdf
  /src.testAddLists()
      /main_test.go:306 +0x1f2

Goroutine 114 (running) created at:
  service.Setup()
     /service.go:39 +0x112
  /src.processSingleUser()
      /main_test.go:405 +0xdf
  src.testAddLists()
      /main_test.go:306 +0x1f2