Skip to content

Commit ce7bbce

Browse files
Updating code for chapter 10.
1 parent 96200b8 commit ce7bbce

7 files changed

Lines changed: 50 additions & 69 deletions

File tree

chapter10/listing01/listing01.go

Lines changed: 8 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@ package main
44
import (
55
"errors"
66
"fmt"
7+
"io"
78
"math/rand"
89
"time"
910
)
@@ -14,9 +15,6 @@ func init() {
1415

1516
// =============================================================================
1617

17-
// EOD represents the end of the data stream.
18-
var EOD = errors.New("EOD")
19-
2018
// Data is the structure of the data we are copying.
2119
type Data struct {
2220
Line string
@@ -31,7 +29,7 @@ type Xenia struct{}
3129
func (Xenia) Pull(d *Data) error {
3230
switch rand.Intn(10) {
3331
case 1, 9:
34-
return EOD
32+
return io.EOF
3533

3634
case 5:
3735
return errors.New("Error reading data from Xenia")
@@ -62,11 +60,8 @@ type System struct {
6260

6361
// =============================================================================
6462

65-
// IO provides support to copy bulk data.
66-
type IO struct{}
67-
6863
// pull knows how to pull bulks of data from Xenia.
69-
func (IO) pull(x *Xenia, data []Data) (int, error) {
64+
func pull(x *Xenia, data []Data) (int, error) {
7065
for i := range data {
7166
if err := x.Pull(&data[i]); err != nil {
7267
return i, err
@@ -77,7 +72,7 @@ func (IO) pull(x *Xenia, data []Data) (int, error) {
7772
}
7873

7974
// store knows how to store bulks of data from Pillar.
80-
func (IO) store(p *Pillar, data []Data) error {
75+
func store(p *Pillar, data []Data) error {
8176
for _, d := range data {
8277
if err := p.Store(d); err != nil {
8378
return err
@@ -88,13 +83,13 @@ func (IO) store(p *Pillar, data []Data) error {
8883
}
8984

9085
// Copy knows how to pull and store data from the System.
91-
func (io IO) Copy(sys *System, batch int) error {
86+
func Copy(sys *System, batch int) error {
9287
for {
9388
data := make([]Data, batch)
9489

95-
i, err := io.pull(&sys.Xenia, data)
90+
i, err := pull(&sys.Xenia, data)
9691
if i > 0 {
97-
if err := io.store(&sys.Pillar, data[:i]); err != nil {
92+
if err := store(&sys.Pillar, data[:i]); err != nil {
9893
return err
9994
}
10095
}
@@ -115,8 +110,7 @@ func main() {
115110
Pillar: Pillar{},
116111
}
117112

118-
var io IO
119-
if err := io.Copy(&sys, 3); err != EOD {
113+
if err := Copy(&sys, 3); err != io.EOF {
120114
fmt.Println(err)
121115
}
122116
}

chapter10/listing02/listing02.go

Lines changed: 8 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@ package main
44
import (
55
"errors"
66
"fmt"
7+
"io"
78
"math/rand"
89
"time"
910
)
@@ -14,9 +15,6 @@ func init() {
1415

1516
// =============================================================================
1617

17-
// EOD represents the end of the data stream.
18-
var EOD = errors.New("EOD")
19-
2018
// Data is the structure of the data we are copying.
2119
type Data struct {
2220
Line string
@@ -43,7 +41,7 @@ type Xenia struct{}
4341
func (Xenia) Pull(d *Data) error {
4442
switch rand.Intn(10) {
4543
case 1, 9:
46-
return EOD
44+
return io.EOF
4745

4846
case 5:
4947
return errors.New("Error reading data from Xenia")
@@ -74,11 +72,8 @@ type System struct {
7472

7573
// =============================================================================
7674

77-
// IO provides support to copy bulk data.
78-
type IO struct{}
79-
8075
// pull knows how to pull bulks of data from any Puller.
81-
func (IO) pull(p Puller, data []Data) (int, error) {
76+
func pull(p Puller, data []Data) (int, error) {
8277
for i := range data {
8378
if err := p.Pull(&data[i]); err != nil {
8479
return i, err
@@ -89,7 +84,7 @@ func (IO) pull(p Puller, data []Data) (int, error) {
8984
}
9085

9186
// store knows how to store bulks of data from any Storer.
92-
func (IO) store(s Storer, data []Data) error {
87+
func store(s Storer, data []Data) error {
9388
for _, d := range data {
9489
if err := s.Store(d); err != nil {
9590
return err
@@ -100,13 +95,13 @@ func (IO) store(s Storer, data []Data) error {
10095
}
10196

10297
// Copy knows how to pull and store data from the System.
103-
func (io IO) Copy(sys *System, batch int) error {
98+
func Copy(sys *System, batch int) error {
10499
for {
105100
data := make([]Data, batch)
106101

107-
i, err := io.pull(&sys.Xenia, data)
102+
i, err := pull(&sys.Xenia, data)
108103
if i > 0 {
109-
if err := io.store(&sys.Pillar, data[:i]); err != nil {
104+
if err := store(&sys.Pillar, data[:i]); err != nil {
110105
return err
111106
}
112107
}
@@ -127,8 +122,7 @@ func main() {
127122
Pillar: Pillar{},
128123
}
129124

130-
var io IO
131-
if err := io.Copy(&sys, 3); err != EOD {
125+
if err := Copy(&sys, 3); err != io.EOF {
132126
fmt.Println(err)
133127
}
134128
}

chapter10/listing03/listing03.go

Lines changed: 8 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@ package main
44
import (
55
"errors"
66
"fmt"
7+
"io"
78
"math/rand"
89
"time"
910
)
@@ -14,9 +15,6 @@ func init() {
1415

1516
// =============================================================================
1617

17-
// EOD represents the end of the data stream.
18-
var EOD = errors.New("EOD")
19-
2018
// Data is the structure of the data we are copying.
2119
type Data struct {
2220
Line string
@@ -49,7 +47,7 @@ type Xenia struct{}
4947
func (Xenia) Pull(d *Data) error {
5048
switch rand.Intn(10) {
5149
case 1, 9:
52-
return EOD
50+
return io.EOF
5351

5452
case 5:
5553
return errors.New("Error reading data from Xenia")
@@ -80,11 +78,8 @@ type System struct {
8078

8179
// =============================================================================
8280

83-
// IO provides support to copy bulk data.
84-
type IO struct{}
85-
8681
// pull knows how to pull bulks of data from any Puller.
87-
func (IO) pull(p Puller, data []Data) (int, error) {
82+
func pull(p Puller, data []Data) (int, error) {
8883
for i := range data {
8984
if err := p.Pull(&data[i]); err != nil {
9085
return i, err
@@ -95,7 +90,7 @@ func (IO) pull(p Puller, data []Data) (int, error) {
9590
}
9691

9792
// store knows how to store bulks of data from any Storer.
98-
func (IO) store(s Storer, data []Data) error {
93+
func store(s Storer, data []Data) error {
9994
for _, d := range data {
10095
if err := s.Store(d); err != nil {
10196
return err
@@ -106,13 +101,13 @@ func (IO) store(s Storer, data []Data) error {
106101
}
107102

108103
// Copy knows how to pull and store data from any System.
109-
func (io IO) Copy(ps PullStorer, batch int) error {
104+
func Copy(ps PullStorer, batch int) error {
110105
for {
111106
data := make([]Data, batch)
112107

113-
i, err := io.pull(ps, data)
108+
i, err := pull(ps, data)
114109
if i > 0 {
115-
if err := io.store(ps, data[:i]); err != nil {
110+
if err := store(ps, data[:i]); err != nil {
116111
return err
117112
}
118113
}
@@ -133,8 +128,7 @@ func main() {
133128
Pillar: Pillar{},
134129
}
135130

136-
var io IO
137-
if err := io.Copy(&sys, 3); err != EOD {
131+
if err := Copy(&sys, 3); err != io.EOF {
138132
fmt.Println(err)
139133
}
140134
}

chapter10/listing04/listing04.go

Lines changed: 8 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@ package main
44
import (
55
"errors"
66
"fmt"
7+
"io"
78
"math/rand"
89
"time"
910
)
@@ -14,9 +15,6 @@ func init() {
1415

1516
// =============================================================================
1617

17-
// EOD represents the end of the data stream.
18-
var EOD = errors.New("EOD")
19-
2018
// Data is the structure of the data we are copying.
2119
type Data struct {
2220
Line string
@@ -49,7 +47,7 @@ type Xenia struct{}
4947
func (Xenia) Pull(d *Data) error {
5048
switch rand.Intn(10) {
5149
case 1, 9:
52-
return EOD
50+
return io.EOF
5351

5452
case 5:
5553
return errors.New("Error reading data from Xenia")
@@ -80,11 +78,8 @@ type System struct {
8078

8179
// =============================================================================
8280

83-
// IO provides support to copy bulk data.
84-
type IO struct{}
85-
8681
// pull knows how to pull bulks of data from any Puller.
87-
func (IO) pull(p Puller, data []Data) (int, error) {
82+
func pull(p Puller, data []Data) (int, error) {
8883
for i := range data {
8984
if err := p.Pull(&data[i]); err != nil {
9085
return i, err
@@ -95,7 +90,7 @@ func (IO) pull(p Puller, data []Data) (int, error) {
9590
}
9691

9792
// store knows how to store bulks of data from any Storer.
98-
func (IO) store(s Storer, data []Data) error {
93+
func store(s Storer, data []Data) error {
9994
for _, d := range data {
10095
if err := s.Store(d); err != nil {
10196
return err
@@ -106,13 +101,13 @@ func (IO) store(s Storer, data []Data) error {
106101
}
107102

108103
// Copy knows how to pull and store data from any System.
109-
func (io IO) Copy(ps PullStorer, batch int) error {
104+
func Copy(ps PullStorer, batch int) error {
110105
for {
111106
data := make([]Data, batch)
112107

113-
i, err := io.pull(ps, data)
108+
i, err := pull(ps, data)
114109
if i > 0 {
115-
if err := io.store(ps, data[:i]); err != nil {
110+
if err := store(ps, data[:i]); err != nil {
116111
return err
117112
}
118113
}
@@ -133,8 +128,7 @@ func main() {
133128
Storer: Pillar{},
134129
}
135130

136-
var io IO
137-
if err := io.Copy(&sys, 3); err != EOD {
131+
if err := Copy(&sys, 3); err != io.EOF {
138132
fmt.Println(err)
139133
}
140134
}

chapter10/listing06/listing06

1.03 MB
Binary file not shown.
Lines changed: 16 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,7 @@
33
package main
44

55
import (
6-
"github.com/ardanlabs/gotraining/topics/composition/example7/pubsub"
6+
"github.com/goinaction/code/chapter10/listing06/pubsub"
77
)
88

99
// publisher is an interface to allow this package to mock the
@@ -32,15 +32,20 @@ func (m *mock) Subscribe(key string) error {
3232
}
3333

3434
func main() {
35-
var p publisher
3635

37-
// Use the pubsub package.
38-
p = pubsub.New("localhost")
39-
p.Publish("key", "value")
40-
p.Subscribe("key")
41-
42-
// Use the mock type value.
43-
p = &mock{}
44-
p.Publish("key", "value")
45-
p.Subscribe("key")
36+
// Create a slice of publisher interface values. Assign
37+
// the address of a pubsub.PubSub value and the address of
38+
// a mock value.
39+
pubs := []publisher{
40+
pubsub.New("localhost"),
41+
&mock{},
42+
}
43+
44+
// Range over the interface value to see how the publisher
45+
// interface provides the level of decoupling the user needs.
46+
// The pubsub package did not need to provide the interface type.
47+
for _, p := range pubs {
48+
p.Publish("key", "value")
49+
p.Subscribe("key")
50+
}
4651
}

chapter10/listing06/pubsub/pubsub.go

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
1-
// Package pubsub simulates a package that provides publication/subscription
2-
// type services.
1+
// Package pubsub simulates a package that provides
2+
// publication/subscription type services.
33
package pubsub
44

55
// PubSub provides access to a queue system.

0 commit comments

Comments
 (0)