summaryrefslogtreecommitdiff
path: root/doc/effective_go.html
diff options
context:
space:
mode:
Diffstat (limited to 'doc/effective_go.html')
-rw-r--r--doc/effective_go.html56
1 files changed, 32 insertions, 24 deletions
diff --git a/doc/effective_go.html b/doc/effective_go.html
index a7e6b7bdf..972772d33 100644
--- a/doc/effective_go.html
+++ b/doc/effective_go.html
@@ -297,9 +297,9 @@ determines just which package is being used.
<p>
Another convention is that the package name is the base name of
its source directory;
-the package in <code>src/pkg/container/vector</code>
-is imported as <code>"container/vector"</code> but has name <code>vector</code>,
-not <code>container_vector</code> and not <code>containerVector</code>.
+the package in <code>src/pkg/encoding/base64</code>
+is imported as <code>"encoding/base64"</code> but has name <code>base64</code>,
+not <code>encoding_base64</code> and not <code>encodingBase64</code>.
</p>
<p>
@@ -504,7 +504,7 @@ the body ends in <code>break</code>, <code>continue</code>,
</p>
<pre>
-f, err := os.Open(name, os.O_RDONLY, 0)
+f, err := os.Open(name)
if err != nil {
return err
}
@@ -520,7 +520,7 @@ statements, the resulting code needs no <code>else</code> statements.
</p>
<pre>
-f, err := os.Open(name, os.O_RDONLY, 0)
+f, err := os.Open(name)
if err != nil {
return err
}
@@ -813,7 +813,7 @@ canonical examples are unlocking a mutex or closing a file.
<pre>
// Contents returns the file's contents as a string.
func Contents(filename string) (string, os.Error) {
- f, err := os.Open(filename, os.O_RDONLY, 0)
+ f, err := os.Open(filename)
if err != nil {
return "", err
}
@@ -935,13 +935,14 @@ example of its possibilities.
<h2 id="data">Data</h2>
-<h3 id="allocation_new">Allocation with <code>new()</code></h3>
+<h3 id="allocation_new">Allocation with <code>new</code></h3>
<p>
-Go has two allocation primitives, <code>new()</code> and <code>make()</code>.
+Go has two allocation primitives, the built-in functions
+<code>new</code> and <code>make</code>.
They do different things and apply to different types, which can be confusing,
but the rules are simple.
-Let's talk about <code>new()</code> first.
+Let's talk about <code>new</code> first.
It's a built-in function essentially the same as its namesakes
in other languages: <code>new(T)</code> allocates zeroed storage for a new item of type
<code>T</code> and returns its address, a value of type <code>*T</code>.
@@ -950,9 +951,9 @@ In Go terminology, it returns a pointer to a newly allocated zero value of type
</p>
<p>
-Since the memory returned by <code>new()</code> is zeroed, it's helpful to arrange that the
+Since the memory returned by <code>new</code> is zeroed, it's helpful to arrange that the
zeroed object can be used without further initialization. This means a user of
-the data structure can create one with <code>new()</code> and get right to
+the data structure can create one with <code>new</code> and get right to
work.
For example, the documentation for <code>bytes.Buffer</code> states that
"the zero value for <code>Buffer</code> is an empty buffer ready to use."
@@ -1065,7 +1066,7 @@ s := []string {Enone: "no error", Eio: "Eio", Einval: "invalid argument"}
m := map[int]string{Enone: "no error", Eio: "Eio", Einval: "invalid argument"}
</pre>
-<h3 id="allocation_make">Allocation with <code>make()</code></h3>
+<h3 id="allocation_make">Allocation with <code>make</code></h3>
<p>
Back to allocation.
@@ -1099,8 +1100,8 @@ In contrast, <code>new([]int)</code> returns a pointer to a newly allocated, zer
structure, that is, a pointer to a <code>nil</code> slice value.
<p>
-These examples illustrate the difference between <code>new()</code> and
-<code>make()</code>.
+These examples illustrate the difference between <code>new</code> and
+<code>make</code>.
</p>
<pre>
@@ -1116,9 +1117,9 @@ v := make([]int, 100)
</pre>
<p>
-Remember that <code>make()</code> applies only to maps, slices and channels
+Remember that <code>make</code> applies only to maps, slices and channels
and does not return a pointer.
-To obtain an explicit pointer allocate with <code>new()</code>.
+To obtain an explicit pointer allocate with <code>new</code>.
</p>
<h3 id="arrays">Arrays</h3>
@@ -1473,7 +1474,7 @@ map[string] int
</pre>
<p>
If you want to control the default format for a custom type, all that's required is to define
-a method <code>String() string</code> on the type.
+a method with the signature <code>String() string</code> on the type.
For our simple type <code>T</code>, that might look like this.
</p>
<pre>
@@ -1489,7 +1490,13 @@ to print in the format
7/-2.35/"abc\tdef"
</pre>
<p>
-Our <code>String()</code> method is able to call <code>Sprintf</code> because the
+(If you need to print <em>values</em> of type <code>T</code> as well as pointers to <code>T</code>,
+the receiver for <code>String</code> must be of value type; this example used a pointer because
+that's more efficient and idiomatic for struct types.
+See the section below on <a href="#pointers_vs_values">pointers vs. value receivers</a> for more information.)
+</p>
+<p>
+Our <code>String</code> method is able to call <code>Sprintf</code> because the
print routines are fully reentrant and can be used recursively.
We can even go one step further and pass a print routine's arguments directly to another such routine.
The signature of <code>Printf</code> uses the type <code>...interface{}</code>
@@ -1677,19 +1684,20 @@ var (
<h3 id="init">The init function</h3>
<p>
-Finally, each source file can define its own <code>init()</code> function to
-set up whatever state is required. The only restriction is that, although
+Finally, each source file can define its own niladic <code>init</code> function to
+set up whatever state is required. (Actually each file can have multiple
+<code>init</code> functions.) The only restriction is that, although
goroutines can be launched during initialization, they will not begin
execution until it completes; initialization always runs as a single thread
of execution.
-And finally means finally: <code>init()</code> is called after all the
+And finally means finally: <code>init</code> is called after all the
variable declarations in the package have evaluated their initializers,
and those are evaluated only after all the imported packages have been
initialized.
</p>
<p>
Besides initializations that cannot be expressed as declarations,
-a common use of <code>init()</code> functions is to verify or repair
+a common use of <code>init</code> functions is to verify or repair
correctness of the program state before real execution begins.
</p>
@@ -1893,7 +1901,7 @@ on every instance of a common method.
In such cases, the constructor should return an interface value
rather than the implementing type.
As an example, in the hash libraries
-both <code>crc32.NewIEEE()</code> and <code>adler32.New()</code>
+both <code>crc32.NewIEEE</code> and <code>adler32.New</code>
return the interface type <code>hash.Hash32</code>.
Substituting the CRC-32 algorithm for Adler-32 in a Go program
requires only changing the constructor call;
@@ -2675,7 +2683,7 @@ field for recoverable failures.
<pre>
for try := 0; try &lt; 2; try++ {
- file, err = os.Open(filename, os.O_RDONLY, 0)
+ file, err = os.Open(filename)
if err == nil {
return
}