package main import ( "fmt" "io" "io/ioutil" "log" "os" "github.com/golang/protobuf/proto" pb "github.com/protocolbuffers/protobuf/examples/tutorial" ) func writePerson(w io.Writer, p *pb.Person) { 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) } } func listPeople(w io.Writer, book *pb.AddressBook) { for _, p := range book.People { writePerson(w, p) } } // 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] // [START unmarshal_proto] // Read the existing address book. in, err := ioutil.ReadFile(fname) if err != nil { 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) } // [END unmarshal_proto] listPeople(os.Stdout, book) }