Distributed Services with Go: Chapter 1 Suggestions

Hi Travis! Thank you for the cool book! :slight_smile:

I made a list of issues and thought I could post them chapter by chapter. I’m reviewing distributed-services-with-go_B4.0.pdf. Please let me know if you’d prefer me to post them issue by issue instead. That’s going to take longer…

Chapter 1. Let’s Go

Page footer includes links to:
+ report erratum: http://pragprog.com/titles/tjgo/errata/add
+ discuss: http://forums.pragprog.com/forums/tjgo
+ Are both of these outdated?

So you can build a simple commit log with a slice.

  • (Before reading up on Go) What’s a slice?
  • For a Go newbie, maybe it’s better to call it ‘Go slice’? But I guess the book title does say ‘with Go’ :slight_smile:

Set Up the Project
$ mkdir proglog
$ cd proglog
$ go mod init github.com/travisjeffery/proglog

  • This creates a go.mod in the top-level proglog folder
  • But when I checkout the github project to compare, the go.mod file is in proglog/LetsGo. Thought I’d mention in case things aren’t as intended.

Create a internal/server directory tree in the root of your project and put the following code under the server directory in a file called log.go:

  • Create a → Create ‘an’
  • LetsGo in the code path is not introduced anywhere?
  • Does it need to be there, or should it be ‘proglog’ instead?
  • Personally, I think Chapter_1/ would make it clearer if that were the intention.

LetsGo/internal/server/log.go

  • Trying to copy the code from the pdf didn’t work - all kinds of extra formatting was turning up on the Mac? Is there some option I need to be enabling? I finally copied in one line at a time because even copying one method at a time ran into issues.
  • Clicking on the link takes to the code in the browser! Hadn’t known that, maybe you could mention it in the text? That was a life saver in terms of helping with copying in code!
  1. Unmarshal the request’s JSON body into a struct.
  • (Before reading up on Go) Does struct mean a record here? What’s a struct?
  • For a Go newbie, maybe it’s better to call it ‘Go struct’?

so the user just needs to call ListenAndServe() to

  • What’s ListenAndServe()? Sorry didn’t understand this

$ go run main.go

func main() {

curl -X POST localhost:8080 -d
‘{“record”: {“value”: “TGV0J3MgR28gIzEK”}}’

  • That worked!
  • Would it be a good idea to include the output as well, so that people can cross-check whether things look good?
  • {“offset”:0}

curl -X GET localhost:8080 -d ‘{“offset”: 0}’

  • Would it be a good idea to include the output folks should expect?
  • {“record”:{“value”:“TGV0J3MgR28gIzEK”,“offset”:0}}

Would it be a good idea to include a section on setting up GoLand that would help with debugging later on, even in a later chapter?

  • It took me a while to figure out what to point GOROOT at, with goenv. I finally pointed it at the go version in ~/.goenv/versions/ that my go was coming from and am not sure whether that’s the way to go but it seems to work for now.
1 Like

Also, I was wondering, for the log.go program (the very first one), is it necessary to lock the mutex for Read()? Can’t you have multiple threads reading concurrently? I don’t think the Read function is a critical section.

The mutex makes sure you don’t read from the log while writing to it. You could have n concurrent readers without needing a mutex, if only you were sure no one is writing to it. Actually, this is a scenario for sync.RWMutex. Its docs explain it well: “The lock can be held by an arbitrary number of readers or a single writer”.

1 Like

That makes sense, thank you!