From: Rob Pike Date: Wed, 14 Oct 2009 18:53:55 +0000 (-0700) Subject: add an entry in the lang faq about reference types. X-Git-Tag: weekly.2009-11-06~320 X-Git-Url: http://www.git.cypherpunks.su/?a=commitdiff_plain;h=68c921e25cd7ed5da1ded92677b5c19960f214e5;p=gostls13.git add an entry in the lang faq about reference types. remove a mention of sawzall in the tutorial. R=rsc DELTA=36 (14 added, 4 deleted, 18 changed) OCL=35717 CL=35719 --- diff --git a/doc/go_lang_faq.html b/doc/go_lang_faq.html index 5125d57696..21466437ff 100644 --- a/doc/go_lang_faq.html +++ b/doc/go_lang_faq.html @@ -354,6 +354,20 @@ will not invalidate any existing programs—but without a clear idea of what equality of structs and arrays should mean, it was simpler to leave it out for now.

+

+Why are maps, slices, and channels references while arrays are values?

+

+There's a lot of history on that topic. Early on, maps and channels +were syntactically pointers and it was impossible to declare or use a +non-pointer instance. Also, we struggled with how arrays should work. +Eventually we decided that the strict separation of pointers and +values made the language harder to use. Introducing reference types, +including slices to handle the reference form of arrays, resolved +these issues. Reference types add some regrettable complexity to the +language but they have a large effect on usability: Go became a more +productive, comfortable language when they were introduced. +

+

Concurrency

diff --git a/doc/go_tutorial.html b/doc/go_tutorial.html index 27710ed268..cdf1443e9e 100644 --- a/doc/go_tutorial.html +++ b/doc/go_tutorial.html @@ -147,7 +147,7 @@ or we could go even shorter and write the idiom

The := operator is used a lot in Go to represent an initializing declaration. -(For those who know Sawzall, its := construct is the same, but notice +(For those who know Limbo, its := construct is the same, but notice that Go has no colon after the name in a full var declaration. Also, for simplicity of parsing, := only works inside functions, not at the top level.) @@ -878,9 +878,9 @@ argument. It's easier in many cases in Go. Instead of %llud you can just say %d; Printf knows the size and signedness of the integer and can do the right thing for you. The snippet

-

 
-06    
-07    import "fmt"
+
 
+10        var u64 uint64 = 1<<64-1;
+11        fmt.Printf("%d %d\n", u64, int64(u64));
 

prints @@ -892,11 +892,11 @@ prints In fact, if you're lazy the format %v will print, in a simple appropriate style, any value, even an array or structure. The output of

-

 
-10        var u64 uint64 = 1<<64-1;
-11        fmt.Printf("%d %d\n", u64, int64(u64));
-

-13 // harder stuff +

 
+14        type T struct { a int; b string };
+15        t := T{77, "Sunset Strip"};
+16        a := []int{1, 2, 3, 4};
+17        fmt.Printf("%v %v %v\n", u64, t, a);
 

is @@ -912,9 +912,9 @@ of %v while Println automatically inserts spaces betwe and adds a newline. The output of each of these two lines is identical to that of the Printf call above.

-

 
-14        type T struct { a int; b string };
-15        t := T{77, "Sunset Strip"};
+
 
+18        fmt.Print(u64, " ", t, " ", a, "\n");
+19        fmt.Println(u64, t, a);
 

If you have your own type you'd like Printf or Print to format, @@ -923,11 +923,7 @@ routines will examine the value to inquire whether it implements the method and if so, use it rather than some other formatting. Here's a simple example.

-

 
-05    package main
-

-07 import "fmt" -

+

 
 09    type testType struct { a int; b string }
 

11 func (t *testType) String() string { diff --git a/doc/go_tutorial.txt b/doc/go_tutorial.txt index dd7cd9fd87..3c7dfd1e60 100644 --- a/doc/go_tutorial.txt +++ b/doc/go_tutorial.txt @@ -103,7 +103,7 @@ or we could go even shorter and write the idiom s := ""; The ":=" operator is used a lot in Go to represent an initializing declaration. -(For those who know Sawzall, its ":=" construct is the same, but notice +(For those who know Limbo, its ":=" construct is the same, but notice that Go has no colon after the name in a full "var" declaration. Also, for simplicity of parsing, ":=" only works inside functions, not at the top level.) @@ -567,7 +567,7 @@ argument. It's easier in many cases in Go. Instead of "%llud" you can just say "%d"; "Printf" knows the size and signedness of the integer and can do the right thing for you. The snippet ---PROG progs/print.go 'NR==6' 'NR==7' +--PROG progs/print.go 'NR==10' 'NR==11' prints @@ -576,7 +576,7 @@ prints In fact, if you're lazy the format "%v" will print, in a simple appropriate style, any value, even an array or structure. The output of ---PROG progs/print.go 'NR==10' 'NR==13' +--PROG progs/print.go 'NR==14' 'NR==17' is @@ -589,7 +589,7 @@ of "%v" while "Println" automatically inserts spaces between arguments and adds a newline. The output of each of these two lines is identical to that of the "Printf" call above. ---PROG progs/print.go 'NR==14' 'NR==15' +--PROG progs/print.go 'NR==18' 'NR==19' If you have your own type you'd like "Printf" or "Print" to format, just give it a "String()" method that returns a string. The print @@ -597,7 +597,7 @@ routines will examine the value to inquire whether it implements the method and if so, use it rather than some other formatting. Here's a simple example. ---PROG progs/print_string.go 'NR==5' END +--PROG progs/print_string.go 'NR==9' END Since "*T" has a "String()" method, the default formatter for that type will use it and produce the output