Classes (or Not)

By Jeff Cogswell  |  Posted 2010-01-04 Print this article Print


Classes (or not)

Classes-or what are used for classes-are strange in Go, and it'll be interesting to see how people respond to their unusual nature. To create a class, you first declare a structure type. Structures can only include member variables, no functions. To add member functions to the structure (resulting in a class with methods), you create a function that includes an additional parameter called a receiver. For this receiver, you specify your structure. After that, instances of the structure can call the function as a member, just as in other object-oriented languages.

But this design results in something fascinating: Your receivers (that is, the types you're adding your methods to) don't have to be structures. They can be any type, including an array type or any of the built-in types. The end result is that you can enhance the built-in types, resulting in an extremely object-oriented language akin to something like Smalltalk.

But this isn't really that unique if you've worked in C#, which uses extension methods. Or, if you've worked in JavaScript, this will remind you of how you can use prototypes to add methods to existing object types (such as String). But it is rather unique in a natively compiled language. (And it makes me wonder how some coding purists will feel about it. When C#, for example, added such a feature, some people were upset because it's easy to hack into existing objects and create confusing code.)

Another interesting thing about Go is that it doesn't support inheritance. Why not? Because instead it's interface-based. This might take some getting used to, just as JavaScript's prototype-base takes some getting used to.


If you look through the specification, you'll see a "go" keyword (which is where the language gets its name-plus the fact it's the first two letters of Google). At first I figured this was an old goto statement, and I skipped over it. Wrong.

Go supports what Google has called goroutines. This is basically a coroutine approach, but much more lightweight than what you'll find in some other compiled languages. The whole idea behind goroutines is that data can be shared between the routines, except only one can access it at any given time. Basically that means a form of mutexes is built right into the shared data using what are called channels.

To call a function concurrently, simply use the go keyword, like so:

go list.Sort();

Take a look at the official docs for more information. I think you'll find it pretty cool.

More Features

The language is sprinkled with some nice little features: Declarations can be grouped, which is handy and quick. Break statements aren't necessary inside switch cases. The default is to not fall through. (How many times do you actually use the fall-through feature in C/C++, anyway?) But if you need it to fall through, you simply add the word "fallthrough" at the end of the case. And your code is all package-based, similar to the way Java is.

Further, the language includes a small but rich set of packages for handling things like I/O, regular expressions, and more. Google apologizes that the package list is still small, although growing. Frankly, I think it's already pretty good.

Interestingly, the language also includes no assert. That's fine with me, and I completely agree with Google's rationale that too many C/C++ programmers use assert as a crutch, resulting in bad code. (I, for one, never use assert in my code for just that reason. Well-constructed code should properly handle error condition without covering every other line of code with calls to assert.)

Finally, the language includes garbage collection, even though it's compiled and doesn't make use of an external runtime. The presence of garbage collection is a sticking point for a lot of C++ purists who have grown up with the mantra "for every new, there's a delete." But in today's huge systems, garbage collection is more of a necessity, even though some people might object.

Final Analysis

I like Go. I think we're going to see more of it. But do we need it? I would say yes, and here's why. Let's face it--C++ programming is a pain. Don't get me wrong, I've programmed extensively in C++ since about 1990. I've written several books about it, and have worked with advanced concepts in C++. But that doesn't change my feeling that C++ is a pain in the butt to code compared to modern languages.

With that said, modern, runtime-based languages are not light-weight, and they're not usually as fast as something like C++. Yes, we have just-in-time compilers that can really haul. But they still rarely keep up with a well-written C++ program.

Go seems like the decent replacement for C++. It's truly compiled, yet it has the beauty and simplicity of modern languages. It isn't perfect--for example, I'm not sure I welcome the return of pointers, and I'm a bit suspicious of the interface and receiver approach to classes and objects. That's going to take some relearning, which isn't always easy. But I would say that Google is certainly on to something here.




Jeff Cogswell is the author of Designing Highly Useable Software ( among other books and is the owner/operator of CogsMedia Training and Consulting.Currently Jeff is a senior editor with Ziff Davis Enterprise. Prior to joining Ziff, he spent about 15 years as a software engineer, working on Windows and Unix systems, mastering C++, PHP, and ASP.NET development. He has written over a dozen books.

Submit a Comment

Loading Comments...
Manage your Newsletters: Login   Register My Newsletters

Rocket Fuel