I don't really give much about the dichotomy of "experienced" Go developers vs. unexperienced ones, but I can say that I never felt the need. To the degree that I think it would be useful to turn this around: Why *do* you feel that need? What is the problem you are trying to solve, with just, say, using a rule that you are not touching other type's unexported fields or methods outside that type's methods?
You also mention C, but note that C doesn't allow anything like this (even less so than Go), if you think about it. It's just that in C, the unit of compilation is a file, not a package. So you don't actually *have* anything like "peer" source files. Every file is its own unit and if you want to interact with values, you need to tell the compiler how they look. But there is no actual access-restriction put on anything. Even if a package intends for something to be an opaque pointer, you can always just add a type-def for that type and still access all its fields. Go allows this too, of course, using unsafe. But the Go notion of a "package" of related source files with shared visibility just doesn't exist in C. You can restrict things to a single file (by declaring them static), but that's it. If it's not static, it can be used from *any* other file linked into the final binary in exactly the same way.