1package main 2 3import ( 4 "fmt" 5 "io" 6 "io/ioutil" 7 "log" 8 "os" 9 10 "github.com/golang/protobuf/proto" 11 pb "github.com/protocolbuffers/protobuf/examples/tutorial" 12) 13 14func writePerson(w io.Writer, p *pb.Person) { 15 fmt.Fprintln(w, "Person ID:", p.Id) 16 fmt.Fprintln(w, " Name:", p.Name) 17 if p.Email != "" { 18 fmt.Fprintln(w, " E-mail address:", p.Email) 19 } 20 21 for _, pn := range p.Phones { 22 switch pn.Type { 23 case pb.Person_MOBILE: 24 fmt.Fprint(w, " Mobile phone #: ") 25 case pb.Person_HOME: 26 fmt.Fprint(w, " Home phone #: ") 27 case pb.Person_WORK: 28 fmt.Fprint(w, " Work phone #: ") 29 } 30 fmt.Fprintln(w, pn.Number) 31 } 32} 33 34func listPeople(w io.Writer, book *pb.AddressBook) { 35 for _, p := range book.People { 36 writePerson(w, p) 37 } 38} 39 40// Main reads the entire address book from a file and prints all the 41// information inside. 42func main() { 43 if len(os.Args) != 2 { 44 log.Fatalf("Usage: %s ADDRESS_BOOK_FILE\n", os.Args[0]) 45 } 46 fname := os.Args[1] 47 48 // [START unmarshal_proto] 49 // Read the existing address book. 50 in, err := ioutil.ReadFile(fname) 51 if err != nil { 52 log.Fatalln("Error reading file:", err) 53 } 54 book := &pb.AddressBook{} 55 if err := proto.Unmarshal(in, book); err != nil { 56 log.Fatalln("Failed to parse address book:", err) 57 } 58 // [END unmarshal_proto] 59 60 listPeople(os.Stdout, book) 61} 62