I agree with you on the correct solution - vs. the OP’s request of the GetWrappedXXXX method.
I guess I still don’t understand the “zeroed” concern though. If you adhere to the “don’t mutate values…” then why do the zero copy at all ? The state of the body should still be the state it was passed in as (unless the caller was breaking the aforementioned rule anyway…). Having “blessed types” is not a good design IMO - better to just declare the required interfaces and use those - especially when the object being provided as a parameter is already an interface… just seems lazy… (and long-term error prone). > On Feb 7, 2019, at 3:05 PM, Dan Kortschak <d...@kortschak.io> wrote: > > Their is an assumption in the code that users don't mutate values under > the feet of routines that have been called. The copy does not protect > against that and is not designed for that purpose; it is there to make > the GetBody function return a zeroed copy of the body (for some > definition of zeroed - zero is the state that was handed in to the > NewRequest call). If the behaviour of the copy here is broken, any Go > code that causes a slice, map or pointer to be retained is broken since > the user can mutate the backing data after the call has done work on > it. This becomes a philosophical point. > > There is a simple work around (not as simple as having NewRequest Just > Do The Right Thing™, but reasonable) that does not require reflect and > puts the control in the users' hands. Since the ContentLength and > GetBody fields are exported, they can be set after the return of > NewRequest in the same way that NewRequest does for the blessed types, > but with the users' knowledge of internal behaviours of their types. > > An example of this is here https://bitbucket.org/ausocean/iot/pull-requ > ests/42 > > On Thu, 2019-02-07 at 14:55 -0600, robert engels wrote: >> I see the documented use of the types in NewRequest - you are correct >> - I was wrong. >> >> But, it could of easily also declared that if the provided Reader is >> also a Lener, it uses it to determine the content length. Why have >> this behavior for Closer and not for Lener? Then you don’t need the >> type switch. You say, well the copy... >> >> The current code with the copy is broken - the caller could continue >> to modify the contents of the bytes.Buffer and things would not work >> as expected since the backing array of the slice is shared - so how >> is the copy helping ? The length will remain the same, but the data >> represented could be corrupted. >> >> The correct solution is to declare that NewRequest takes an interface >> Content, that has both Reader and ContentLength methods, where >> ContentLength() can return -1 if the content length is indeterminate. >> Then declare simple facades for Content from bytes.Buffer, a string, >> etc. And also declare that continued use of the Content after >> NewRequest is undefined. And if you wanted to retain the simplicity, >> just declare it uses ContentLength like it uses Closer. >> >> I am all for the simplicity of Go, but “solutions" like NewRequest >> are not the way modern software should be developed. Casting an >> interface to a concrete type is a sign of code that needs design >> work. Having to read the doc in addition to the method signature is >> also a sign the interface needs work (primarily since changes to the >> doc can/will/might change behavior but it avoids compile time type >> checking = brittle code with obscure bugs). >> >> >>> >>> On Feb 7, 2019, at 1:56 PM, Dan Kortschak <d...@kortschak.io> wrote: >>> >>> I didn't mention the word internal, nor did I imply it; with >>> documentation stating that it would be used, it is clearly *not* >>> internal. >>> >>> If you look at the code in question, you can see a probable reason >>> why >>> a Lener interface is not used; for each of the blessed types, a >>> concrete copy of the pointed-to-value is made to allow GetBody to >>> return it. This cannot be done with an interface value without the >>> use >>> of reflect. >>> >>> Please show me a Len method in the standard library that does not >>> return the number of available-to-access elements in a collection. >>> >>> >>> On Thu, 2019-02-07 at 13:27 -0600, robert engels wrote: >>>> >>>> I am not following. You stated that the usage of Len was internal >>>> and >>>> a type switch on known concrete types, so how is related to how >>>> the >>>> OP was attempting to have things work? >>>> >>>> There is no “generally accepted use of Len()”, otherwise it would >>>> not >>>> need to perform a type switch on known concrete types - it would >>>> cast >>>> to an interface declaring Len(), and use the interface, and then >>>> it >>>> would work with any type. >>>> >>>>> >>>>> >>>>> On Feb 7, 2019, at 1:07 PM, Dan Kortschak <d...@kortschak.io> >>>>> wrote: >>>>> >>>>> Yeah, I'm not agreeing with you. >>>>> >>>>> On Thu, 2019-02-07 at 07:07 -0600, Robert Engels wrote: >>>>>> >>>>>> >>>>>> You are agreeing with me. A type switch on concrete types >>>>>> (that >>>>>> you >>>>>> control) is far different than using an available Len() >>>>>> method >>>>>> and >>>>>> assuming the same semantics. >>>>>> >>>>>>> >>>>>>> >>>>>>> >>>>>>> On Feb 7, 2019, at 1:05 AM, Dan Kortschak <d...@kortschak.io >>>>>>>> >>>>>>> wrote: >>>>>>> >>>>>>> Addressing the first sentence, it was a direct answer to a >>>>>>> comment >>>>>>> you >>>>>>> made: >>>>>>> >>>>>>>> >>>>>>>> >>>>>>>> >>>>>>>> But is it really? If you read the description for Len() >>>>>>>> on >>>>>>>> bytes.Buffer it is the length of unread portion. But that >>>>>>>> doesn’t >>>>>>>> mean the buffer isn’t just a portion of the entire body - >>>>>>>> it >>>>>>>> can >>>>>>>> be a >>>>>>>> chunk which is continually reloaded. >>>>>>> As far as the claim that there is a need to have a Len >>>>>>> method >>>>>>> in >>>>>>> io.Reader, have a look at the code in question. It type >>>>>>> asserts >>>>>>> on >>>>>>> three concrete types that are known to the function, all >>>>>>> three >>>>>>> have >>>>>>> a >>>>>>> Len method and this is used to obtain the known length. All >>>>>>> other >>>>>>> io.Readers are considered to have an unknown length. >>>>>>> >>>>>>> Whether it's wrong to use Len depends on whether there is a >>>>>>> generally >>>>>>> accepted and consistent set of semantics to Len() int. >>>>>>> There >>>>>>> is. >>>>>>> This >>>>>>> is strengthened if the use of an existing Len method is >>>>>>> noted >>>>>>> in >>>>>>> the >>>>>>> docs. >>>>>>> >>>>>>>> >>>>>>>> >>>>>>>> >>>>>>>> On Wed, 2019-02-06 at 15:50 -0600, robert engels wrote: >>>>>>>> I am not sure what that has to do with the discussion. My >>>>>>>> point >>>>>>>> was >>>>>>>> that for it to be applicable here, it needs to be defined >>>>>>>> as >>>>>>>> part >>>>>>>> of >>>>>>>> io.Reader, since that is what Body is declared as. It is >>>>>>>> not, >>>>>>>> so >>>>>>>> using in the manner outlined is not correct IMO. >>>>>>>> >>>>>>>>> >>>>>>>>> >>>>>>>>> >>>>>>>>> >>>>>>>>> On Feb 6, 2019, at 3:37 PM, Dan Kortschak <dan@kortscha >>>>>>>>> k.io >>>>>>>>>> >>>>>>>>>> >>>>>>>>> wrote: >>>>>>>>> >>>>>>>>> The generalised semantics of Len are that it returns >>>>>>>>> the >>>>>>>>> number >>>>>>>>> of >>>>>>>>> available elements in the collection, being a cognate >>>>>>>>> of >>>>>>>>> the >>>>>>>>> len >>>>>>>>> built- >>>>>>>>> in. This means that as you consume elements from a >>>>>>>>> buffer, >>>>>>>>> the >>>>>>>>> Len >>>>>>>>> value reduces. This is directly equivalent to >>>>>>>>> >>>>>>>>> for len(buf) != 0 { >>>>>>>>> println(buf[0]) >>>>>>>>> buf = buf[1:] >>>>>>>>> } >>>>>>>>> >>>>>>>>>> >>>>>>>>>> >>>>>>>>>> >>>>>>>>>> On Wed, 2019-02-06 at 08:56 -0600, Robert Engels >>>>>>>>>> wrote: >>>>>>>>>> >>>>>>>>>> But is it really? If you read the description for >>>>>>>>>> Len() >>>>>>>>>> on >>>>>>>>>> bytes.Buffer it is the length of unread portion. But >>>>>>>>>> that >>>>>>>>>> doesn’t >>>>>>>>>> mean the buffer isn’t just a portion of the entire >>>>>>>>>> body - >>>>>>>>>> it >>>>>>>>>> can >>>>>>>>>> be a >>>>>>>>>> chunk which is continually reloaded. >>>>>>>>>> >>>>>>>>>> This is the danger in using private APIs publically >>>>>>>>>> based >>>>>>>>>> upon >>>>>>>>>> the >>>>>>>>>> existence of a method - it leads to very brittle code >>>>>>>>>> - >>>>>>>>>> and >>>>>>>>>> there >>>>>>>>>> are >>>>>>>>>> almost certainly better ways to design it to avoid >>>>>>>>>> these >>>>>>>>>> issues. >>>>>>>>>> If >>>>>>>>>> the core api is not expressive enough then it will be >>>>>>>>>> more >>>>>>>>>> difficult. >>>>>>>>>> >>>>>>>>>>> >>>>>>>>>>> >>>>>>>>>>> >>>>>>>>>>> >>>>>>>>>>> >>>>>>>>>>> On Feb 6, 2019, at 8:30 AM, Burak Serdar <bserdar@i >>>>>>>>>>> eee. >>>>>>>>>>> org> >>>>>>>>>>> wrote: >>>>>>>>>>> >>>>>>>>>>>> >>>>>>>>>>>> >>>>>>>>>>>> >>>>>>>>>>>> >>>>>>>>>>>> >>>>>>>>>>>> On Wed, Feb 6, 2019 at 5:15 AM Robert Engels >>>>>>>>>>>> <rengels >>>>>>>>>>>> @ix. >>>>>>>>>>>> netc >>>>>>>>>>>> om.c >>>>>>>>>>>> om> wrote: >>>>>>>>>>>> >>>>>>>>>>>> I see now, but if that can be the case, shouldn’t >>>>>>>>>>>> the >>>>>>>>>>>> Body be >>>>>>>>>>>> documented that the Reader may be a >>>>>>>>>>>> ReaderWithLen, >>>>>>>>>>>> and >>>>>>>>>>>> the >>>>>>>>>>>> consumer is free to type check/cast? If not, you >>>>>>>>>>>> are >>>>>>>>>>>> using >>>>>>>>>>>> internal details that you should not be. >>>>>>>>>>> Yes, the documentation should say if the reader has >>>>>>>>>>> a >>>>>>>>>>> Len() >>>>>>>>>>> method >>>>>>>>>>> it >>>>>>>>>>> would be used to set the ContentLength. Len is no >>>>>>>>>>> longer an >>>>>>>>>>> internal >>>>>>>>>>> detail then. >>>>>>>>>>> >>>>>>>>>>>> >>>>>>>>>>>> >>>>>>>>>>>> >>>>>>>>>>>> >>>>>>>>>>>> >>>>>>>>>>>> >>>>>>>>>>>> This is a problem with Go in general. Because the >>>>>>>>>>>> returned >>>>>>>>>>>> object >>>>>>>>>>>> “implements” some interface because it happens to >>>>>>>>>>>> have >>>>>>>>>>>> the >>>>>>>>>>>> required method, doesn’t mean it was designed to >>>>>>>>>>>> be >>>>>>>>>>>> used >>>>>>>>>>>> that >>>>>>>>>>>> way, or that it has the required semantics - >>>>>>>>>>>> unless >>>>>>>>>>>> documented to >>>>>>>>>>>> have them. >>>>>>>>>>> I agree with you there. Len() is straight forward, >>>>>>>>>>> but >>>>>>>>>>> in >>>>>>>>>>> general >>>>>>>>>>> just >>>>>>>>>>> because a function is named something doesn't mean >>>>>>>>>>> it'll do >>>>>>>>>>> the >>>>>>>>>>> same >>>>>>>>>>> thing for all implementations. On the other end of >>>>>>>>>>> the >>>>>>>>>>> spectrum >>>>>>>>>>> is >>>>>>>>>>> Java-like interfaces where you want explicit >>>>>>>>>>> inheritance of >>>>>>>>>>> a >>>>>>>>>>> specific >>>>>>>>>>> interface. I don't know if there's anything in >>>>>>>>>>> between, >>>>>>>>>>> but >>>>>>>>>>> I >>>>>>>>>>> like >>>>>>>>>>> Go's approach much better. >>>>>>>>>>> >>>>>>>>>>>> >>>>>>>>>>>> >>>>>>>>>>>> >>>>>>>>>>>> >>>>>>>>>>>> >>>>>>>>>>>> >>>>>>>>>>>> On Feb 6, 2019, at 2:22 AM, Matteo Biagetti >>>>>>>>>>>> <matteo.biagetti@ >>>>>>>>>>>> gmai >>>>>>>>>>>> l.com> wrote: >>>>>>>>>>>> >>>>>>>>>>>> Make sense, thanks for explanation >>>>>>>>>>>> >>>>>>>>>>>> >>>>>>>>>>>> >>>>>>>>>>>> Il giorno mercoledì 6 febbraio 2019 07:28:54 >>>>>>>>>>>> UTC+1, >>>>>>>>>>>> Burak >>>>>>>>>>>> Serdar >>>>>>>>>>>> ha scritto: >>>>>>>>>>>>> >>>>>>>>>>>>> >>>>>>>>>>>>> >>>>>>>>>>>>> >>>>>>>>>>>>> >>>>>>>>>>>>> >>>>>>>>>>>>> On Tue, Feb 5, 2019 at 8:13 PM robert engels >>>>>>>>>>>>> <ren.. >>>>>>>>>>>>> .@ix >>>>>>>>>>>>> .net >>>>>>>>>>>>> com. >>>>>>>>>>>>> com> wrote: >>>>>>>>>>>>>> >>>>>>>>>>>>>> >>>>>>>>>>>>>> >>>>>>>>>>>>>> >>>>>>>>>>>>>> >>>>>>>>>>>>>> >>>>>>>>>>>>>> That’s what I was trying to point out. Your >>>>>>>>>>>>>> design is >>>>>>>>>>>>>> not >>>>>>>>>>>>>> correct. The Body is a Reader, not a Buffer - >>>>>>>>>>>>>> the >>>>>>>>>>>>>> length >>>>>>>>>>>>>> of >>>>>>>>>>>>>> the request/body may be indeterminate - that >>>>>>>>>>>>>> is, >>>>>>>>>>>>>> a >>>>>>>>>>>>>> stream. >>>>>>>>>>>>>> Attempting to get the length of an underlying >>>>>>>>>>>>>> buffer >>>>>>>>>>>>>> is >>>>>>>>>>>>>> not >>>>>>>>>>>>>> only probably not possible, but not correct >>>>>>>>>>>>>> in >>>>>>>>>>>>>> many >>>>>>>>>>>>>> situations. >>>>>>>>>>>>> The length of the body *may* be indeterminate, >>>>>>>>>>>>> and >>>>>>>>>>>>> if >>>>>>>>>>>>> that's >>>>>>>>>>>>> the case, >>>>>>>>>>>>> the underlying Reader will not have a Len >>>>>>>>>>>>> method. >>>>>>>>>>>>> The >>>>>>>>>>>>> design is >>>>>>>>>>>>> to >>>>>>>>>>>>> handle the case where the underlying Reader is >>>>>>>>>>>>> a >>>>>>>>>>>>> Buffer >>>>>>>>>>>>> with a >>>>>>>>>>>>> Len >>>>>>>>>>>>> method. If the Reader has Len, then the >>>>>>>>>>>>> NopCloser >>>>>>>>>>>>> derived >>>>>>>>>>>>> from >>>>>>>>>>>>> that >>>>>>>>>>>>> will also have a Len, and NewRequest can set >>>>>>>>>>>>> the >>>>>>>>>>>>> content >>>>>>>>>>>>> length. If >>>>>>>>>>>>> the Reader does not have Len, then the content >>>>>>>>>>>>> length >>>>>>>>>>>>> is >>>>>>>>>>>>> unknown. >>>>>>>>>>>>> >>>>>>>>>>>>>> >>>>>>>>>>>>>> >>>>>>>>>>>>>> >>>>>>>>>>>>>> >>>>>>>>>>>>>> >>>>>>>>>>>>>> >>>>>>>>>>>>>> There is a reason the Body is a ReaderCloser >>>>>>>>>>>>>> and >>>>>>>>>>>>>> not >>>>>>>>>>>>>> a >>>>>>>>>>>>>> buffer. It is part of the http specification. >>>>>>>>>>>>>> >>>>>>>>>>>>>> On Feb 5, 2019, at 9:00 PM, Burak Serdar >>>>>>>>>>>>>> <bse...@ >>>>>>>>>>>>>> ieee >>>>>>>>>>>>>> .org >>>>>>>>>>>>>>> >>>>>>>>>>>>>>> >>>>>>>>>>>>>>> >>>>>>>>>>>>>>> >>>>>>>>>>>>>> wrote: >>>>>>>>>>>>>> >>>>>>>>>>>>>> On Tue, Feb 5, 2019 at 7:00 PM Robert Engels >>>>>>>>>>>>>> <ren...@ >>>>>>>>>>>>>> ix.n >>>>>>>>>>>>>> etco >>>>>>>>>>>>>> m.com> wrote: >>>>>>>>>>>>>> >>>>>>>>>>>>>> >>>>>>>>>>>>>> Shouldn’t you just be taking the content >>>>>>>>>>>>>> length >>>>>>>>>>>>>> from >>>>>>>>>>>>>> the >>>>>>>>>>>>>> header if forwarding the same body. There is >>>>>>>>>>>>>> no >>>>>>>>>>>>>> need >>>>>>>>>>>>>> for >>>>>>>>>>>>>> the >>>>>>>>>>>>>> length of the body. >>>>>>>>>>>>>> >>>>>>>>>>>>>> >>>>>>>>>>>>>> True. What I was suggesting is a fix for the >>>>>>>>>>>>>> general >>>>>>>>>>>>>> case. >>>>>>>>>>>>>> >>>>>>>>>>>>>> >>>>>>>>>>>>>> On Feb 5, 2019, at 6:53 PM, Burak Serdar >>>>>>>>>>>>>> <bse...@ >>>>>>>>>>>>>> ieee >>>>>>>>>>>>>> .org >>>>>>>>>>>>>>> >>>>>>>>>>>>>>> >>>>>>>>>>>>>>> >>>>>>>>>>>>>>> >>>>>>>>>>>>>> wrote: >>>>>>>>>>>>>> >>>>>>>>>>>>>> On Tue, Feb 5, 2019 at 5:18 PM Dan Kortschak >>>>>>>>>>>>>> <d.. >>>>>>>>>>>>>> .@ko >>>>>>>>>>>>>> rtsc >>>>>>>>>>>>>> hak. >>>>>>>>>>>>>> io> wrote: >>>>>>>>>>>>>> >>>>>>>>>>>>>> Personally, I think this is a bug in the >>>>>>>>>>>>>> behaviour of >>>>>>>>>>>>>> NewRequest. See h >>>>>>>>>>>>>> ttps://github.com/golang/go/issues/18117 for >>>>>>>>>>>>>> some >>>>>>>>>>>>>> additional >>>>>>>>>>>>>> context. >>>>>>>>>>>>>> >>>>>>>>>>>>>> >>>>>>>>>>>>>> Agreed. One solution could be to have: >>>>>>>>>>>>>> >>>>>>>>>>>>>> type HasLen interface { >>>>>>>>>>>>>> int Len() >>>>>>>>>>>>>> } >>>>>>>>>>>>>> >>>>>>>>>>>>>> Then have NopCloser return a nopCloser with >>>>>>>>>>>>>> len >>>>>>>>>>>>>> if >>>>>>>>>>>>>> the >>>>>>>>>>>>>> underlying >>>>>>>>>>>>>> implementation has len, with the obvious >>>>>>>>>>>>>> changes >>>>>>>>>>>>>> to >>>>>>>>>>>>>> NewRequest.Ugly, >>>>>>>>>>>>>> but can be done without API changes. >>>>>>>>>>>>>> >>>>>>>>>>>>>> >>>>>>>>>>>>>> >>>>>>>>>>>>>> >>>>>>>>>>>>>> On Tue, 2019-02-05 at 05:18 -0800, matteo.... >>>>>>>>>>>>>> @gma >>>>>>>>>>>>>> il.c >>>>>>>>>>>>>> om >>>>>>>>>>>>>> wrote: >>>>>>>>>>>>>> I've the following situation: >>>>>>>>>>>>>> I proxy a request to another server and when >>>>>>>>>>>>>> I >>>>>>>>>>>>>> made a >>>>>>>>>>>>>> POST >>>>>>>>>>>>>> and create >>>>>>>>>>>>>> a new >>>>>>>>>>>>>> request, the contentLength is zero: >>>>>>>>>>>>>> >>>>>>>>>>>>>> req2, _ := http.NewRequest(req.Method, >>>>>>>>>>>>>> newApiUrl >>>>>>>>>>>>>> , >>>>>>>>>>>>>> req.Body) >>>>>>>>>>>>>> fmt.Println("New request from body:", >>>>>>>>>>>>>> req2.ContentLength) // >>>>>>>>>>>>>> print 0 >>>>>>>>>>>>>> >>>>>>>>>>>>>> Checking in the source code of the NewRequest >>>>>>>>>>>>>> func >>>>>>>>>>>>>> Body >>>>>>>>>>>>>> don't >>>>>>>>>>>>>> respect >>>>>>>>>>>>>> some >>>>>>>>>>>>>> interface and populate the ContentLength >>>>>>>>>>>>>> field. >>>>>>>>>>>>>> >>>>>>>>>>>>>> Could be a bug? Which could be a valid >>>>>>>>>>>>>> approach >>>>>>>>>>>>>> in >>>>>>>>>>>>>> order >>>>>>>>>>>>>> to >>>>>>>>>>>>>> create a >>>>>>>>>>>>>> new >>>>>>>>>>>>>> request from an existing one and correct set >>>>>>>>>>>>>> the >>>>>>>>>>>>>> Body >>>>>>>>>>>>>> length? >>>>>>>>>>>>>> >>>>>>>>>>>>>> A working example here: >>>>>>>>>>>>>> >>>>>>>>>>>>>> https://play.golang.org/p/SvCDLj0NrXb >>>>>>>>>>>>>> >>>>>>>>>>>>>> Thanks! >>>>>>>>>>>>>> >>>>>>>>>>>>>> >>>>>>>>>>>>>> -- >>>>>>>>>>>>>> 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...@googlegro >>>>>>>>>>>>>> ups. >>>>>>>>>>>>>> com. >>>>>>>>>>>>>> For more options, visit https://groups.google >>>>>>>>>>>>>> .com >>>>>>>>>>>>>> /d/o >>>>>>>>>>>>>> ptou >>>>>>>>>>>>>> t. >>>>>>>>>>>>>> >>>>>>>>>>>>>> >>>>>>>>>>>>>> -- >>>>>>>>>>>>>> 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...@googlegro >>>>>>>>>>>>>> ups. >>>>>>>>>>>>>> com. >>>>>>>>>>>>>> For more options, visit https://groups.google >>>>>>>>>>>>>> .com >>>>>>>>>>>>>> /d/o >>>>>>>>>>>>>> ptou >>>>>>>>>>>>>> t. >>>>>>>>>>>>>> >>>>>>>>>>>>>> >>>>>>>>>>>>>> -- >>>>>>>>>>>>>> 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...@googlegro >>>>>>>>>>>>>> ups. >>>>>>>>>>>>>> com. >>>>>>>>>>>>>> For more options, visit https://groups.google >>>>>>>>>>>>>> .com >>>>>>>>>>>>>> /d/o >>>>>>>>>>>>>> ptou >>>>>>>>>>>>>> t. >>>>>>>>>>>>>> >>>>>>>>>>>>>> >>>>>>>>>>>>>> -- >>>>>>>>>>>>>> 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...@googlegro >>>>>>>>>>>>>> ups. >>>>>>>>>>>>>> com. >>>>>>>>>>>>>> For more options, visit https://groups.google >>>>>>>>>>>>>> .com >>>>>>>>>>>>>> /d/o >>>>>>>>>>>>>> ptou >>>>>>>>>>>>>> t. >>>>>>>>>>>>>> >>>>>>>>>>>>>> >>>>>>>>>>>> -- >>>>>>>>>>>> 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+unsubscribe@googlegr >>>>>>>>>>>> oups >>>>>>>>>>>> .com >>>>>>>>>>>> . >>>>>>>>>>>> For more options, visit https://groups.google.com >>>>>>>>>>>> /d/o >>>>>>>>>>>> ptou >>>>>>>>>>>> t. >>>>>>>>>>>> >>>>>>>>>>>> -- >>>>>>>>>>>> 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+unsubscribe@googlegr >>>>>>>>>>>> oups >>>>>>>>>>>> .com >>>>>>>>>>>> . >>>>>>>>>>>> For more options, visit https://groups.google.com >>>>>>>>>>>> /d/o >>>>>>>>>>>> ptou >>>>>>>>>>>> t. -- 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.