1
0
mirror of https://github.com/golang/go synced 2024-11-25 00:17:58 -07:00

update tutorial for new slicing rules.

R=rsc
DELTA=13  (6 added, 0 deleted, 7 changed)
OCL=27539
CL=27541
This commit is contained in:
Rob Pike 2009-04-15 20:53:07 -07:00
parent b340879ce3
commit dfff1829d4

View File

@ -188,8 +188,12 @@ In Go, since arrays are values, it's meaningful (and useful) to talk
about pointers to arrays. about pointers to arrays.
The size of the array is part of its type; however, one can declare The size of the array is part of its type; however, one can declare
a <i>slice</i> variable, to which one can assign any array value a <i>slice</i> variable, to which one can assign a pointer to
with the same element type. Slices look a lot like arrays but have any array
with the same element type or - much more commonly - a <i>slice
expression</i> of the form "a[low : high]", representing
the subarray indexed by "low" through "high-1".
Slices look a lot like arrays but have
no explicit size ("[]" vs. "[10]") and they reference a segment of no explicit size ("[]" vs. "[10]") and they reference a segment of
an underlying, often anonymous, regular array. Multiple slices an underlying, often anonymous, regular array. Multiple slices
can share data if they represent pieces of the same array; can share data if they represent pieces of the same array;
@ -203,7 +207,8 @@ of an array stored within your structure, you should use a regular
array. array.
When passing an array to a function, you almost always want When passing an array to a function, you almost always want
to declare the formal parameter to be a slice. Go will automatically to declare the formal parameter to be a slice. When you call
the function, take the address of the array and Go will automatically
create (efficiently) a slice reference and pass that. create (efficiently) a slice reference and pass that.
Using slices one can write this function (from "sum.go"): Using slices one can write this function (from "sum.go"):
@ -217,16 +222,17 @@ and invoke it like this:
Note how the return type ("int") is defined for "sum()" by stating it Note how the return type ("int") is defined for "sum()" by stating it
after the parameter list. after the parameter list.
The expression "[3]int{1,2,3}" -- a type followed by a brace-bounded expression The expression "[3]int{1,2,3}" -- a type followed by a brace-bounded expression
-- is a constructor for a value, in this case an array of 3 "ints". We pass it -- is a constructor for a value, in this case an array of 3 "ints". Putting an "&"
to "sum()" by (automatically) promoting it to a slice. in front gives us the address of a unique instance of the value. We pass the
pointer to "sum()" by (automatically) promoting it to a slice.
If you are creating a regular array but want the compiler to count the If you are creating a regular array but want the compiler to count the
elements for you, use "..." as the array size: elements for you, use "..." as the array size:
s := sum([...]int{1,2,3}); s := sum(&[...]int{1,2,3});
In practice, though, unless you're meticulous about storage layout within a In practice, though, unless you're meticulous about storage layout within a
data structure, a slice - using empty brackets - is all you need: data structure, a slice itself - using empty brackets and no "&" - is all you need:
s := sum([]int{1,2,3}); s := sum([]int{1,2,3});