Hacker News new | ask | show | jobs
by simiones 1749 days ago
There are no such things as "reference types" in Go, though slices do have the extremely odd behavior that they can take the value `nil`, similarly to interfaces and unlike any other non-pointer type in Go.

Pointers to "fat pointer" types are sometimes needed, just like you sometimes need pointers-to-pointers.

1 comments

What about maps? Non-nil maps sure seem like they're "reference types", look at [0].

[0] https://play.golang.org/p/xtY_ASExQzR

"reference types" is a very specific concept from a specific category of languages: types which are always heap-allocated and sitting behind an invisible (and un-interactible) pointer.

But Go doesn't have that distinction, and has actual pointers you can use directly. A map is just a heap-allocated structure sitting behind a pointer.

If you create a type which is a pointer to a struct, sure you can say you've built a reference type if you want, but that doesn't actually say much to anyone, because that's not a distinction the language makes, unlike Java or C#.

> types which are always heap-allocated and sitting behind an invisible (and un-interactible) pointer

> A map is just a heap-allocated structure sitting behind a pointer.

And the difference is?.. Because maps in Go behave exactly as if they were un-referenceable pointers to the hidden, heap-allocated hashtables.