diff options
author | Tim Swast <swast@google.com> | 2015-11-20 15:32:53 -0800 |
---|---|---|
committer | Tim Swast <swast@google.com> | 2015-11-25 10:46:35 -0800 |
commit | 7e31c4d930efa3f80d0f03c93e788ba73b847fd8 (patch) | |
tree | 9e3980cce5ad25c42e013b51d28d503cd4b7891c /examples/list_people.go | |
parent | f1e14fba2300010d6f2966b2e32d4aa0842cdffb (diff) | |
download | protobuf-7e31c4d930efa3f80d0f03c93e788ba73b847fd8.tar.gz protobuf-7e31c4d930efa3f80d0f03c93e788ba73b847fd8.tar.bz2 protobuf-7e31c4d930efa3f80d0f03c93e788ba73b847fd8.zip |
Add a Go language example.
This follows the other examples so that it can be used as a tutorial,
such as the ones at:
https://developers.google.com/protocol-buffers/docs/tutorials
Even though Go generally does not use Makefiles, I added targets for the
Go examples to be consistent with the other languages.
Edit:
Fix Travis run. Change to use $HOME instead of ~. Add protoc to path.
GOPATH entry cannot start with shell metacharacter '~': "~/gocode"
Edit(2):
Fix Go code style to address comments.
Diffstat (limited to 'examples/list_people.go')
-rw-r--r-- | examples/list_people.go | 59 |
1 files changed, 59 insertions, 0 deletions
diff --git a/examples/list_people.go b/examples/list_people.go new file mode 100644 index 00000000..48b1fbfa --- /dev/null +++ b/examples/list_people.go @@ -0,0 +1,59 @@ +package main + +import ( + "fmt" + "io" + "io/ioutil" + "log" + "os" + + "github.com/golang/protobuf/proto" + pb "github.com/google/protobuf/examples/tutorial" +) + +func listPeople(w io.Writer, book *pb.AddressBook) { + for _, p := range book.People { + fmt.Fprintln(w, "Person ID:", p.Id) + fmt.Fprintln(w, " Name:", p.Name) + if p.Email != "" { + fmt.Fprintln(w, " E-mail address:", p.Email) + } + + for _, pn := range p.Phones { + switch pn.Type { + case pb.Person_MOBILE: + fmt.Fprint(w, " Mobile phone #: ") + case pb.Person_HOME: + fmt.Fprint(w, " Home phone #: ") + case pb.Person_WORK: + fmt.Fprint(w, " Work phone #: ") + } + fmt.Fprintln(w, pn.Number) + } + } +} + +// Main reads the entire address book from a file and prints all the +// information inside. +func main() { + if len(os.Args) != 2 { + log.Fatalf("Usage: %s ADDRESS_BOOK_FILE\n", os.Args[0]) + } + fname := os.Args[1] + + // Read the existing address book. + in, err := ioutil.ReadFile(fname) + if err != nil { + if os.IsNotExist(err) { + fmt.Printf("%s: File not found. Creating new file.\n", fname) + } else { + log.Fatalln("Error reading file:", err) + } + } + book := &pb.AddressBook{} + if err := proto.Unmarshal(in, book); err != nil { + log.Fatalln("Failed to parse address book:", err) + } + + listPeople(os.Stdout, book) +} |