seems I have found out why you must return a pointer but it has to be of 
type `error` return :/
I posted this gotcha a few mins ago.
https://forum.golangbridge.org/t/logic-behind-failing-nil-check/16331?u=kevlar_c

On Wednesday, November 13, 2019 at 5:24:30 PM UTC, Brian Candler wrote:
>
> In https://blog.golang.org/error-handling-and-go, it shows the well-known 
> error interface:
>
> type error interface {
>     Error() string
> }
>
> and it gives an example of a user-defined error:
>
> // errorString is a trivial implementation of error.
> type errorString struct {
>     s string
> }
>
> func (e *errorString) Error() string {
>     return e.s
> }
>
> // New returns an error that formats as the given text.
> func New(text string) error {
>     return &errorString{text}
> }
>
> I notice that it's returning a *pointer* to an error object.  My question 
> is: is there a particular reason for returning a pointer here, rather than 
> a direct instance of an error?
>
> The word "pointer" doesn't appear anywhere in that blog posting.  Clearly 
> a pointer allows the possibility of returning "nil" - but an interface 
> variable can have a nil value <https://tour.golang.org/methods/13> too. 
> Without the pointers, it becomes:
>
> func (e errorString) Error() string {
>     return e.s
> }
>
> func New(text string) error {
>     return errorString{text}
> }
>
> and this appears to work the same - see a longer example on play 
> <https://play.golang.org/p/joVzZ-PPs8E> (based on someone else's example, 
> but I just removed the pointers).
>
> I'm aware that the method set of *T includes the methods of T, so a 
> pointer functions perfectly well in place of a concrete value to implement 
> an interface.  Also, passing a pointer might be slightly more efficient, in 
> that it reduces a bit of copying.  Other than that, is there a reason why 
> code should return pointers to error objects rather than error objects?
>
> I did try looking through the FAQ, which asks "Should I define methods on 
> values or pointers? 
> <https://golang.org/doc/faq#methods_on_values_or_pointers>" (although not 
> "should I return values or pointers?"), and ends up by saying:
>
>
> *For types such as basic types, slices, and small structs, a value 
> receiver is very cheap so unless the semantics of the method requires a 
> pointer, a value receiver is efficient and clear.*
>
> Which makes me wonder if I'm missing some other reason for using pointers 
> in this context.
>
> Many thanks,
>
> Brian.
>

-- 
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.
To view this discussion on the web visit 
https://groups.google.com/d/msgid/golang-nuts/4b81afa8-dedf-49db-aa25-bc72e81047bd%40googlegroups.com.

Reply via email to