mirror of
https://github.com/golang/go
synced 2024-09-04 15:34:21 +00:00
doc: improve the interface example in Effective Go
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>
This commit is contained in:
parent
048c9164a0
commit
cf20540880
|
@ -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))
|
||||
}
|
||||
|
|
|
@ -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 += " "
|
||||
}
|
||||
|
|
Loading…
Reference in a new issue