Skip to content
Projects
Groups
Snippets
Help
Loading...
Sign in
Toggle navigation
G
golang
Project
Project
Details
Activity
Cycle Analytics
Repository
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Charts
Issues
0
Issues
0
List
Board
Labels
Milestones
Merge Requests
0
Merge Requests
0
Wiki
Wiki
Snippets
Snippets
Members
Members
Collapse sidebar
Close sidebar
Activity
Graph
Charts
Create a new issue
Commits
Issue Boards
Open sidebar
go
golang
Commits
6ac19ece
Commit
6ac19ece
authored
Nov 02, 2009
by
Rob Pike
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
correct a few things in Go for C++ Programmers
R=iant, rsc CC=go-dev
http://go/go-review/1016015
parent
c2b6418c
Hide whitespace changes
Inline
Side-by-side
Showing
1 changed file
with
43 additions
and
32 deletions
+43
-32
go_for_cpp_programmers.html
doc/go_for_cpp_programmers.html
+43
-32
No files found.
doc/go_for_cpp_programmers.html
View file @
6ac19ece
...
...
@@ -8,14 +8,15 @@ to nothing about the similarities.
<p>
For a more general introduction to Go, see the
<a
href=
"go_tutorial.html"
>
Go tutorial
</a>
.
<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>
.
<p>
There is more
<a
href=
"
.
/"
>
documentation about go
</a>
.
There is more
<a
href=
"/"
>
documentation about go
</a>
.
<h2
id=
"Conceptual_Differences"
>
Conceptual Differences
</h2>
...
...
@@ -56,8 +57,8 @@ There is more <a href="./">documentation about go</a>.
<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
which starts
with an
upper
case letter, than
object is visible to any other file which
(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
...
...
@@ -151,15 +152,16 @@ var v1 = v2;
</pre>
<p>
Go permits multiple assignments which are done in parallel.
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, indicating by a list in
parentheses.
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);
...
...
@@ -195,9 +197,11 @@ statement, or the expressions of a <code>for</code> statement, or the value of a
around the body of an
<code>
if
</code>
or
<code>
for
</code>
statement.
<pre>
if a
<
b { f() } // Valid
if (a
<
b) { f() } // Valid
if (a
<
b) f(); // INVALID
if a
<
b { f() } // Valid
if (a
<
b) { f() } // Valid (condition is parenthesized expression)
if (a
<
b) f(); // INVALID
for i = 0; i
<
10
;
i
++
{}
//
Valid
for
(
i =
0;
i
<
10
;
i
++)
{}
//
INVALID
</
pre
>
<p>
...
...
@@ -263,7 +267,8 @@ 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.
An untyped constant becomes typed when it is used within a context that
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.
...
...
@@ -309,7 +314,7 @@ Given an array, or another slice, a new slice is created via
creates a new slice which refers to
<code>
a
</code>
, starts at
index
<code>
I
</code>
, and ends at index
<code>
J - 1
</code>
. It has length
<code>
J - I
</code>
.
If
<code>
a
</code>
is itself a slice, t
he new slice refers to the same array
T
he 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
...
...
@@ -335,6 +340,8 @@ necessary to pass the length of the buffer; it is efficiently accessible via
<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>
...
...
@@ -342,10 +349,10 @@ whose value is a substring of the original string.
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>
returns a new object of type
<code>
*int
</code>
,
a
llocated on the heap and initialized with the value
<code>
0
</code>
.
Unlike C++,
<code>
new
</code>
is a function, not an operator;
For example,
<code>
new(int)
</code>
allocates a new int on the heap,
initializes it with the value
<code>
0
</code>
,
a
nd 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>
...
...
@@ -361,8 +368,8 @@ 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
i
s the
buffering capacity of the channel.
argument which
set
s 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.
...
...
@@ -378,7 +385,8 @@ sometime after there are no references to the returned slice.
<h2
id=
"Interfaces"
>
Interfaces
</h2>
<p>
Where C++ provides classes and templates, Go provides interfaces. A
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
...
...
@@ -441,7 +449,7 @@ will accept a
variable of type
<code>
*myType
</code>
.
<pre>
func getAndSet(x myInterface)
;
func getAndSet(x myInterface)
{}
func f1() {
var p myType;
getAndSet(
&
p);
...
...
@@ -495,22 +503,23 @@ 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. This conversion is implemented dynamically
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 my
Compare
Interface interface {
type my
Print
Interface interface {
print();
}
func f3(x myInterface) {
x.(my
CompareInterface).print()
x.(my
PrintInterface).print() // type assertion to myPrintInterface
}
</pre>
<p>
The conversion to
<code>
my
Compare
Interface
</code>
is entirely dynamic.
The conversion to
<code>
my
Print
Interface
</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.
...
...
@@ -525,8 +534,9 @@ type Any interface { }
</pre>
<p>
Containers may be written in terms of
<code>
Any
</code>
, and the caller may cast
the values back to the desired type. As the typing is dynamic rather
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.
...
...
@@ -561,21 +571,22 @@ go server(1); go server(2);
<p>
(Note that the
<code>
for
</code>
statement in the
<code>
server
</code>
function is equivalent to a C++
<code>
while (true)
</code>
loop
).
function is equivalent to a C++
<code>
while (true)
</code>
loop
.)
<p>
Goroutines are (intended to be) cheap.
<p>
Function literals can be useful with the
<code>
go
</code>
statement.
Function literals (which Go implements as closures)
can be useful with the
<code>
go
</code>
statement.
<pre>
var g int
// global variable
var g int
;
go func(i int) {
s := 0
for j := 0; j
<
i; j++ { s += j }
g = s
} (1000) // Passes argument 1000 to the function literal.
g = s
;
} (1000)
;
// Passes argument 1000 to the function literal.
</pre>
<h2
id=
"Channels"
>
Channels
</h2>
...
...
@@ -627,7 +638,7 @@ func manager2(ch chan cmd2) {
</pre>
<p>
To use
manager2
, given a channel to it:
To use
<code>
manager2
</code>
, given a channel to it:
<pre>
func f4(ch
<
- chan cmd2) int {
...
...
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment