Thanks for the thorough answer! I think you answered my question. The errors package was the simplest piece of code I could find where it didn't seem to matter whether a value or pointer was passed so I wanted to know why a pointer was passed instead of a value.
As you mentioned twice now (with proof <https://github.com/golang/go/blob/master/src/errors/errors_test.go#L14>) it did matter that a pointer was passed and the time package is likely a great counter example where Time is retuned as a value instead of pointer from time.New. (I'm now interested to know why time.New does this. I believe I read an explanation some time ago which I'll search for.) I don't have a specific semantic problem per se – I just wanted to learn more about some nuances/uses of the language and you helped greatly. Thanks! On Tuesday, 13 December 2016 12:36:17 UTC, Axel Wagner wrote: > > On Tue, Dec 13, 2016 at 10:48 AM, Jon <jonathan...@gmail.com <javascript:> > > wrote: > >> Axel, that's an interesting thought on why errors.New() returns a >> &errorString. However, I would argue that being able to do >> errors.New("foo") == errors.New("foo") could be seen as a feature by some >> people to break dependencies >> > > Well, not by the authors of the errors package, apparently :) > > Also note, that there is a common adage about not comparing error strings. > I'd also argue, that this is confusing: > return fmt.Errorf("foo failed: %s", v) > In some instances this could be seen as "the same error", even with > different v, in other instances not. I believe it's better to be explicit > about this and not depend on the error-message; the error-message is for > humans to read, not for computers to distinguish (I mean, if nothing else, > comparing strings is less efficient than comparing a pointer). > > > >> Therefore I am not quite convinced this is the sole reason why >> &errorString{} is returned instead of errorString{}. >> > > Allow me to convince you, then: > https://github.com/golang/go/blob/master/src/errors/errors_test.go#L14 > <https://www.google.com/url?q=https%3A%2F%2Fgithub.com%2Fgolang%2Fgo%2Fblob%2Fmaster%2Fsrc%2Ferrors%2Ferrors_test.go%23L14&sa=D&sntz=1&usg=AFQjCNGBrbg1RKyZ8RiCjbNvDJ-w2vX01g> > It's clearly a requirement chosen by the author of the package (which is > rsc, btw, who I CC'ed). And I, at least, can't think of a better way to > achieve this requirement. > > In case any one else reads this, this question/discussion isn't really >> about the errors package it's about what to return from a New function if >> you need similar functionality to the errors package. >> > > I think you should be more precise, than "similar functionality". The > errors package is special, as we've discussed here, in that it has very > specific semantics about how equality works. If you want the same semantics > then do the same thing. If you don't want those semantics, don't do it :) > > I mean, regardless of whether you believe that the semantics where > *intended*, those are the semantics that you'll *get* (and AFAIK they're > the most sensible way to get them), so you should work from that. > > You could also look at time.Time, which has different semantics (it's a > small struct, but it's supposed to be passed around by value and you need > to be aware of the used *time.Location when comparing (and use Before/After > if you are interested in the instant in time). > > There are tons of other examples, each with their own specific semantic. > Knowing what the semantics are, that you are going for, would be helpful > here :) > > >> I want to know what the thought process was behind returning a >> &errorString{} from errors.New instead of errorString{} or even 'type >> errorString string'. >> >> On Saturday, 10 December 2016 22:13:16 UTC, Axel Wagner wrote: >>> >>> >>> >>> On Sat, Dec 10, 2016 at 8:10 PM, Jon <jonathan...@gmail.com> wrote: >>> >>>> I would like to know what my default practice should be when returning >>>> structs from functions. Should I return a value or a pointer? (Assume I >>>> don't need the functionality of returning a pointer and my struct contains >>>> at most one simple field so a vast copy isn't needed if I return a value.) >>>> >>>> A specific example could be the errors package >>>> <https://golang.org/src/errors/errors.go> with errors.New. >>>> >>>> The New function is implemented by returning an errorString pointer: >>>> <https://play.golang.org/p/WPmP8ZVS0_> >>>> >>>> func New(text string) error { >>>> return &errorString{text} >>>> } >>>> >>>> Could it just as easily have been implemented by returning an errorString >>>> value <https://play.golang.org/p/Gawy-mgw2X>? If so why was the >>>> pointer return chosen over value return? >>>> >>> >>> Because that way >>> errors.New("foo") != errors.New("foo") >>> This means, that if two packages were to define errors with the same >>> message by coincidence, they wouldn't get mixed up. >>> >>> >>>> func New(text string) error { >>>> return errorString{text} >>>> } >>>> >>>> Could it also have been implemented as below >>>> <https://play.golang.org/p/H2NIARHO-Y> which looks even simpler? >>>> >>>> func New(text string) error { >>>> return errorString(text) >>>> } >>>> // errorString is a trivial implementation of error. >>>> type errorString string >>>> >>>> func (e errorString) Error() string { >>>> return string(e) >>>> } >>>> >>>> What was the thought process that went into the implementation of the >>>> errors package? Were the latter two implementation options I suggest >>>> considered? If so why were they disregarded? Performance? Coding >>>> standards? >>>> Heap allocation benefits? >>>> >>>> -- >>>> 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...@googlegroups.com. >>>> For more options, visit https://groups.google.com/d/optout. >>>> >>> >>> -- >> 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...@googlegroups.com <javascript:>. >> For more options, visit https://groups.google.com/d/optout. >> > > -- 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.