<!-- Go For C++ Programmers -->

<p>
Go is a systems programming language intended to be a general-purpose
systems language, like C++.
These are some notes on Go for experienced C++ programmers. This
document discusses the differences between Go and C++, and says little
to nothing about the similarities.

<p>
For a more general introduction to Go, see the
<a href="go_tutorial.html">Go tutorial</a> and
<a href="effective_go.html">Effective Go</a>.

<p>
For a detailed description of the Go language, see the
<a href="go_spec.html">Go spec</a>.

<h2 id="Conceptual_Differences">Conceptual Differences</h2>

<ul>
<li>Go does not have classes with constructors or destructors.
    Instead of class methods, a class inheritance hierarchy,
    and virtual functions, Go provides <em>interfaces</em>, which are
    <a href="#Interfaces">discussed in more detail below</a>.
    Interfaces are also used where C++ uses templates.

<li>Go uses garbage collection. It is not necessary (or possible)
    to release memory explicitly. The garbage collection is (intended to be)
    incremental and highly efficient on modern processors.

<li>Go has pointers but not pointer arithmetic. You cannot
    use a pointer variable to walk through the bytes of a string.

<li>Arrays in Go are first class values. When an array is used as a
    function parameter, the function receives a copy of the array, not
    a pointer to it. However, in practice functions often use slices
    for parameters; slices hold pointers to underlying arrays.  Slices
    are <a href="#Slices">discussed further below</a>.

<li>Strings are provided by the language. They may not be changed once they
    have been created.

<li>Hash tables are provided by the language. They are called maps.

<li>Separate threads of execution, and communication channels between
    them, are provided by the language. This
    is <a href="#Goroutines">discussed further below</a>.

<li>Certain types (maps and channels, described further below)
    are passed by reference, not by value. That is, passing a map to a
    function does not copy the map, and if the function changes the map
    the change will be seen by the caller.  In C++ terms, one can
    think of these as being reference types.

<li>Go does not use header files. Instead, each source file is part of a
    defined <em>package</em>. When a package defines an object
    (type, constant, variable, function) with a name starting with an
    upper case letter, that object is visible to any other file which
    imports that package.

<li>Go does not support implicit type conversion. Operations that mix
    different types require casts (called conversions in Go).

<li>Go does not support function overloading and does not support user
    defined operators.

<li>Go does not support <code>const</code> or <code>volatile</code> qualifiers.

<li>Go uses <code>nil</code> for invalid pointers, where C++ uses
    <code>NULL</code> or simply <code>0</code>.
</ul>

<h2 id="Syntax">Syntax</h2>

<p>
The declaration syntax is reversed compared to C++. You write the name
followed by the type. Unlike in C++, the syntax for a type does not match
the way in which the variable is used. Type declarations may be read
easily from left to right.

<pre>
<b>Go                           C++</b>
var v1 int                // int v1;
var v2 string             // const std::string v2;  (approximately)
var v3 [10]int            // int v3[10];
var v4 []int              // int* v4;  (approximately)
var v5 struct { f int }   // struct { int f; } v5;
var v6 *int               // int* v6;  (but no pointer arithmetic)
var v7 map[string]int     // unordered_map&lt;string, int&gt;* v7;  (approximately)
var v8 func(a int) int    // int (*v8)(int a);
</pre>

<p>
Declarations generally take the form of a keyword followed by the name
of the object being declared.  The keyword is one of <code>var</code>,
<code>func</code>,
<code>const</code>, or <code>type</code>.  Method declarations are a minor
exception in that
the receiver appears before the name of the object being declared; see
the <a href="#Interfaces">discussion of interfaces</a>.

<p>
You can also use a keyword followed by a series of declarations in
parentheses.

<pre>
var (
    i int
    m float
)
</pre>

<p>
When declaring a function, you must either provide a name for each parameter
or not provide a name for any parameter; you can't omit some names
and provide others.  You may group several names with the same type:

<pre>
func f(i, j, k int, s, t string)
</pre>

<p>
A variable may be initialized when it is declared.  When this is done,
specifying the type is permitted but not required.  When the type is
not specified, the type of the variable is the type of the
initialization expression.

<pre>
var v = *p
</pre>

<p>
See also the <a href="#Constants">discussion of constants, below</a>.
If a variable is not initialized explicitly, the type must be specified.
In that case it will be
implicitly initialized to the type's zero value (0, nil, etc.).  There are no
uninitialized variables in Go.

<p>
Within a function, a short declaration syntax is available with
<code>:=</code> .

<pre>
v1 := v2
</pre>

<p>
This is equivalent to

<pre>
var v1 = v2
</pre>

<p>
Go permits multiple assignments, which are done in parallel.

<pre>
i, j = j, i    // Swap i and j.
</pre>

<p>
Functions may have multiple return values, indicated by a list in
parentheses.  The returned values can be stored by assignment
to a list of variables.

<pre>
func f() (i int, j int) { ... }
v1, v2 = f()
</pre>

<p>
Go code uses very few semicolons in practice.  Technically, all Go
statements are terminated by a semicolon.  However, Go treats the end
of a non-blank line as a semicolon unless the line is clearly
incomplete (the exact rules are
in <a href="go_spec.html#Semicolons">the language specification</a>).
A consequence of this is that in some cases Go does not permit you to
use a line break.  For example, you may not write
<pre>
func g()
{                  // INVALID
}
</pre>
A semicolon will be inserted after <code>g()</code>, causing it to be
a function declaration rather than a function definition.  Similarly,
you may not write
<pre>
if x {
}
else {             // INVALID
}
</pre>
A semicolon will be inserted after the <code>}</code> preceding
the <code>else</code>, causing a syntax error.

<p>
Since semicolons do end statements, you may continue using them as in
C++.  However, that is not the recommended style.  Idiomatic Go code
omits unnecessary semicolons, which in practice is all of them other
than the initial <for> loop clause and cases where you want several
short statements on a single line.

<p>
While we're on the topic, we recommend that rather than worry about
semicolons and brace placement, you format your code with
the <code>gofmt</code> program.  That will produce a single standard
Go style, and let you worry about your code rather than your
formatting.  While the style may initially seem odd, it is as good as
any other style, and familiarity will lead to comfort.

<p>
When using a pointer to a struct, you use <code>.</code> instead
of <code>-&gt;</code>.
Thus syntactically speaking a structure and a pointer to a structure
are used in the same way.

<pre>
type myStruct struct { i int }
var v9 myStruct              // v9 has structure type
var p9 *myStruct             // p9 is a pointer to a structure
f(v9.i, p9.i)
</pre>

<p>
Go does not require parentheses around the condition of a <code>if</code>
statement, or the expressions of a <code>for</code> statement, or the value of a
<code>switch</code> statement.  On the other hand, it does require curly braces
around the body of an <code>if</code> or <code>for</code> statement.

<pre>
if a &lt; b { f() }             // Valid
if (a &lt; b) { f() }           // Valid (condition is a parenthesized expression)
if (a &lt; b) f()               // INVALID
for i = 0; i &lt; 10; i++ {}    // Valid
for (i = 0; i &lt; 10; i++) {}  // INVALID
</pre>

<p>
Go does not have a <code>while</code> statement nor does it have a
<code>do/while</code>
statement.  The <code>for</code> statement may be used with a single condition,
which makes it equivalent to a <code>while</code> statement.  Omitting the
condition entirely is an endless loop.

<p>
Go permits <code>break</code> and <code>continue</code> to specify a label.
The label must
refer to a <code>for</code>, <code>switch</code>, or <code>select</code>
statement.

<p>
In a <code>switch</code> statement, <code>case</code> labels do not fall
through.  You can
make them fall through using the <code>fallthrough</code> keyword.  This applies
even to adjacent cases.

<pre>
switch i {
case 0:  // empty case body
case 1:
    f()  // f is not called when i == 0!
}
</pre>

<p>
But a <code>case</code> can have multiple values.

<pre>
switch i {
case 0, 1:
    f()  // f is called if i == 0 || i == 1.
}
</pre>

<p>
The values in a <code>case</code> need not be constants&mdash;or even integers;
any type
that supports the equality comparison operator, such as strings or
pointers, can be used&mdash;and if the <code>switch</code>
value is omitted it defaults to <code>true</code>.

<pre>
switch {
case i &lt; 0:
    f1()
case i == 0:
    f2()
case i &gt; 0:
    f3()
}
</pre>

<p>
The <code>++</code> and <code>--</code> operators may only be used in
statements, not in expressions.
You cannot write <code>c = *p++</code>.  <code>*p++</code> is parsed as
<code>(*p)++</code>.

<p>
The <code>defer</code> statement may be used to call a function after
the function containing the <code>defer</code> statement returns.

<pre>
fd := open("filename")
defer close(fd)         // fd will be closed when this function returns.
</pre>

<h2 id="Constants">Constants </h2>

<p>
In Go constants may be <i>untyped</i>. This applies even to constants
named with a <code>const</code> declaration, if no
type is given in the declaration and the initializer expression uses only
untyped constants.
A value derived from an untyped constant becomes typed when it
is used within a context that
requires a typed value. This permits constants to be used relatively
freely without requiring general implicit type conversion.

<pre>
var a uint
f(a + 1)  // untyped numeric constant "1" becomes typed as uint
</pre>

<p>
The language does not impose any limits on the size of an untyped
numeric constant or constant expression. A limit is only applied when
a constant is used where a type is required.

<pre>
const huge = 1 &lt;&lt; 100
f(huge &gt;&gt; 98)
</pre>

<p>
Go does not support enums.  Instead, you can use the special name
<code>iota</code> in a single <code>const</code> declaration to get a
series of increasing
value.  When an initialization expression is omitted for a <code>const</code>,
it reuses the preceding expression.

<pre>
const (
    red = iota   // red == 0
    blue         // blue == 1
    green        // green == 2
)
</pre>

<h2 id="Slices">Slices</h2>

<p>
A slice is conceptually a struct with three fields: a
pointer to an array, a length, and a capacity.
Slices support
the <code>[]</code> operator to access elements of the underlying array.
The builtin
<code>len</code> function returns the
length of the slice.  The builtin <code>cap</code> function returns the
capacity.

<p>
Given an array, or another slice, a new slice is created via
<code>a[I:J]</code>.  This
creates a new slice which refers to <code>a</code>, starts at
index <code>I</code>, and ends before index
<code>J</code>.  It has length <code>J - I</code>.
The new slice refers to the same array
to which <code>a</code>
refers.  That is, changes made using the new slice may be seen using
<code>a</code>.  The
capacity of the new slice is simply the capacity of <code>a</code> minus
<code>I</code>.  The capacity
of an array is the length of the array.  You may also assign an array pointer
to a variable of slice type; given <code>var s []int; var a[10] int</code>,
the assignment <code>s = &amp;a</code> is equivalent to
<code>s = a[0:len(a)]</code>.

<p>
What this means is that Go uses slices for some cases where C++ uses pointers.
If you create a value of type <code>[100]byte</code> (an array of 100 bytes,
perhaps a
buffer) and you want to pass it to a function without copying it, you should
declare the function parameter to have type <code>[]byte</code>, and pass the
address
of the array.  Unlike in C++, it is not
necessary to pass the length of the buffer; it is efficiently accessible via
<code>len</code>.

<p>
The slice syntax may also be used with a string.  It returns a new string,
whose value is a substring of the original string.
Because strings are immutable, string slices can be implemented
without allocating new storage for the slices's contents.

<h2 id="Making_values">Making values</h2>

<p>
Go has a builtin function <code>new</code> which takes a type and
allocates space
on the heap. The allocated space will be zero-initialized for the type.
For example, <code>new(int)</code> allocates a new int on the heap,
initializes it with the value <code>0</code>,
and returns its address, which has type <code>*int</code>.
Unlike in C++, <code>new</code> is a function, not an operator;
<code>new int</code> is a syntax error.

<p>
Map and channel values must be allocated using the builtin function
<code>make</code>.
A variable declared with map or channel type without an initializer will be
automatically initialized to <code>nil</code>.
Calling <code>make(map[int]int)</code> returns a newly allocated value of
type <code>map[int]int</code>.
Note that <code>make</code> returns a value, not a pointer.  This is
consistent with
the fact that map and channel values are passed by reference.  Calling
<code>make</code> with
a map type takes an optional argument which is the expected capacity of the
map.  Calling <code>make</code> with a channel type takes an optional
argument which sets the
buffering capacity of the channel; the default is 0 (unbuffered).

<p>
The <code>make</code> function may also be used to allocate a slice.
In this case it
allocates memory for the underlying array and returns a slice referring to it.
There is one required argument, which is the number of elements in the slice.
A second, optional, argument is the capacity of the slice.  For example,
<code>make([]int, 10, 20)</code>.  This is identical to
<code>new([20]int)[0:10]</code>.  Since
Go uses garbage collection, the newly allocated array will be discarded
sometime after there are no references to the returned slice.

<h2 id="Interfaces">Interfaces</h2>

<p>
Where C++ provides classes, subclasses and templates,
Go provides interfaces.  A
Go interface is similar to a C++ pure abstract class: a class with no
data members, with methods which are all pure virtual.  However, in
Go, any type which provides the methods named in the interface may be
treated as an implementation of the interface.  No explicitly declared
inheritance is required.  The implementation of the interface is
entirely separate from the interface itself.

<p>
A method looks like an ordinary function definition, except that it
has a <em>receiver</em>.  The receiver is similar to
the <code>this</code> pointer in a C++ class method.

<pre>
type myType struct { i int }
func (p *myType) get() int { return p.i }
</pre>

<p>
This declares a method <code>get</code> associated with <code>myType</code>.
The receiver is named <code>p</code> in the body of the function.

<p>
Methods are defined on named types.  If you convert the value
to a different type, the new value will have the methods of the new type,
not the old type.

<p>
You may define methods on a builtin type by declaring a new named type
derived from it.  The new type is distinct from the builtin type.

<pre>
type myInteger int
func (p myInteger) get() int { return int(p) } // Conversion required.
func f(i int) { }
var v myInteger
// f(v) is invalid.
// f(int(v)) is valid; int(v) has no defined methods.
</pre>

<p>
Given this interface:

<pre>
type myInterface interface {
	get() int
	set(i int)
}
</pre>

<p>
we can make <code>myType</code> satisfy the interface by adding

<pre>
func (p *myType) set(i int) { p.i = i }
</pre>

<p>
Now any function which takes <code>myInterface</code> as a parameter
will accept a
variable of type <code>*myType</code>.

<pre>
func getAndSet(x myInterface) {}
func f1() {
	var p myType
	getAndSet(&amp;p)
}
</pre>

<p>
In other words, if we view <code>myInterface</code> as a C++ pure abstract
base
class, defining <code>set</code> and <code>get</code> for
<code>*myType</code> made <code>*myType</code> automatically
inherit from <code>myInterface</code>.  A type may satisfy multiple interfaces.

<p>
An anonymous field may be used to implement something much like a C++ child
class.

<pre>
type myChildType struct { myType; j int }
func (p *myChildType) get() int { p.j++; return p.myType.get() }
</pre>

<p>
This effectively implements <code>myChildType</code> as a child of
<code>myType</code>.

<pre>
func f2() {
	var p myChildType
	getAndSet(&amp;p)
}
</pre>

<p>
The <code>set</code> method is effectively inherited from
<code>myChildType</code>, because
methods associated with the anonymous field are promoted to become methods
of the enclosing type.  In this case, because <code>myChildType</code> has an
anonymous field of type <code>myType</code>, the methods of
<code>myType</code> also become methods of <code>myChildType</code>.
In this example, the <code>get</code> method was
overridden, and the <code>set</code> method was inherited.

<p>
This is not precisely the same as a child class in C++.
When a method of an anonymous field is called,
its receiver is the field, not the surrounding struct.
In other words, methods on anonymous fields are not virtual functions.
When you want the equivalent of a virtual function, use an interface.

<p>
A variable which has an interface type may be converted to have a
different interface type using a special construct called a type assertion.
This is implemented dynamically
at runtime, like C++ <code>dynamic_cast</code>.  Unlike
<code>dynamic_cast</code>, there does
not need to be any declared relationship between the two interfaces.

<pre>
type myPrintInterface interface {
  print()
}
func f3(x myInterface) {
	x.(myPrintInterface).print()  // type assertion to myPrintInterface
}
</pre>

<p>
The conversion to <code>myPrintInterface</code> is entirely dynamic.
It will
work as long as the underlying type of x (the <em>dynamic type</em>) defines
a <code>print</code> method.

<p>
Because the conversion is dynamic, it may be used to implement generic
programming similar to templates in C++.  This is done by
manipulating values of the minimal interface.

<pre>
type Any interface { }
</pre>

<p>
Containers may be written in terms of <code>Any</code>, but the caller
must unbox using a type assertion to recover
values of the contained type.  As the typing is dynamic rather
than static, there is no equivalent of the way that a C++ template may
inline the relevant operations.  The operations are fully type-checked
at runtime, but all operations will involve a function call.

<pre>
type iterator interface {
	get() Any
	set(v Any)
	increment()
	equal(arg *iterator) bool
}
</pre>

<h2 id="Goroutines">Goroutines</h2>

<p>
Go permits starting a new thread of execution (a <em>goroutine</em>)
using the <code>go</code>
statement.  The <code>go</code> statement runs a function in a
different, newly created, goroutine.
All goroutines in a single program share the same address space.

<p>
Internally, goroutines act like coroutines that are multiplexed among
multiple operating system threads.  You do not have to worry
about these details.

<pre>
func server(i int) {
    for {
        print(i)
        sys.sleep(10)
    }
}
go server(1)
go server(2)
</pre>

<p>
(Note that the <code>for</code> statement in the <code>server</code>
function is equivalent to a C++ <code>while (true)</code> loop.)

<p>
Goroutines are (intended to be) cheap.

<p>
Function literals (which Go implements as closures)
can be useful with the <code>go</code> statement.

<pre>
var g int
go func(i int) {
	s := 0
	for j := 0; j &lt; i; j++ { s += j }
	g = s
}(1000)  // Passes argument 1000 to the function literal.
</pre>

<h2 id="Channels">Channels</h2>

<p>
Channels are used to communicate between goroutines.  Any value may be
sent over a channel.  Channels are (intended to be) efficient and
cheap.  To send a value on a channel, use <code>&lt;-</code> as a binary
operator.  To
receive a value on a channel, use <code>&lt;-</code> as a unary operator.
When calling
functions, channels are passed by reference.

<p>
The Go library provides mutexes, but you can also use
a single goroutine with a shared channel.
Here is an example of using a manager function to control access to a
single value.

<pre>
type cmd struct { get bool; val int }
func manager(ch chan cmd) {
	var val int = 0
	for {
		c := &lt;- ch
		if c.get { c.val = val ch &lt;- c }
		else { val = c.val }
	}
}
</pre>

<p>
In that example the same channel is used for input and output.
This is incorrect if there are multiple goroutines communicating
with the manager at once: a goroutine waiting for a response
from the manager might receive a request from another goroutine
instead.
A solution is to pass in a channel.

<pre>
type cmd2 struct { get bool; val int; ch &lt;- chan int }
func manager2(ch chan cmd2) {
	var val int = 0
	for {
		c := &lt;- ch
		if c.get { c.ch &lt;- val }
		else { val = c.val }
	}
}
</pre>

<p>
To use <code>manager2</code>, given a channel to it:

<pre>
func f4(ch &lt;- chan cmd2) int {
	myCh := make(chan int)
	c := cmd2{ true, 0, myCh }   // Composite literal syntax.
	ch &lt;- c
	return &lt;-myCh
}
</pre>
