]> Cypherpunks repositories - gostls13.git/commitdiff
doc: improve the interface example in Effective Go
authorRob Pike <r@golang.org>
Mon, 26 Nov 2018 03:51:08 +0000 (14:51 +1100)
committerRob Pike <r@golang.org>
Mon, 26 Nov 2018 05:08:25 +0000 (05:08 +0000)
The String method is n-squared and overwrites its receiver.
Fix both issues, with only a slight loss of clarity.

Fixes #28773

Change-Id: I588f69d4cbd72931b28b984671512834473bd466
Reviewed-on: https://go-review.googlesource.com/c/151217
Reviewed-by: Brad Fitzpatrick <bradfitz@golang.org>
doc/effective_go.html
doc/progs/eff_sequence.go

index 1743d0fa112820ebbf22cb2b0f75649667222e50..ddfea76d433ef422b84cc2b161d1d8ff2d902a5d 100644 (file)
@@ -2106,12 +2106,14 @@ In this contrived example <code>Sequence</code> satisfies both.
 
 <p>
 The <code>String</code> method of <code>Sequence</code> is recreating the
-work that <code>Sprint</code> already does for slices.  We can share the
-effort if we convert the <code>Sequence</code> to a plain
+work that <code>Sprint</code> already does for slices.
+(It also has complexity O(N²), which is poor.) We can share the
+effort (and also speed it up) if we convert the <code>Sequence</code> to a plain
 <code>[]int</code> before calling <code>Sprint</code>.
 </p>
 <pre>
 func (s Sequence) String() string {
+    s = s.Copy()
     sort.Sort(s)
     return fmt.Sprint([]int(s))
 }
@@ -2138,6 +2140,7 @@ type Sequence []int
 
 // Method for printing - sorts the elements before printing
 func (s Sequence) String() string {
+    s = s.Copy()
     sort.IntSlice(s).Sort()
     return fmt.Sprint([]int(s))
 }
index 11c885abf82a34013248c5246167434f4f8776da..ab1826b6ee3b9355817687fd03d58ac90d37b252 100644 (file)
@@ -28,11 +28,18 @@ func (s Sequence) Swap(i, j int) {
        s[i], s[j] = s[j], s[i]
 }
 
+// Copy returns a copy of the Sequence.
+func (s Sequence) Copy() Sequence {
+       copy := make(Sequence, 0, len(s))
+       return append(copy, s...)
+}
+
 // Method for printing - sorts the elements before printing.
 func (s Sequence) String() string {
+       s = s.Copy() // Make a copy; don't overwrite argument.
        sort.Sort(s)
        str := "["
-       for i, elem := range s {
+       for i, elem := range s { // Loop is O(N²); will fix that in next example.
                if i > 0 {
                        str += " "
                }