|  | // Copyright 2018 The Go Authors. All rights reserved. | 
|  | // Use of this source code is governed by a BSD-style | 
|  | // license that can be found in the LICENSE file. | 
|  |  | 
|  | // +build ignore | 
|  |  | 
|  | package fmt_test | 
|  |  | 
|  | import ( | 
|  | "fmt" | 
|  | ) | 
|  |  | 
|  | // Address has a City, State and a Country. | 
|  | type Address struct { | 
|  | City    string | 
|  | State   string | 
|  | Country string | 
|  | } | 
|  |  | 
|  | // Person has a Name, Age and Address. | 
|  | type Person struct { | 
|  | Name string | 
|  | Age  uint | 
|  | Addr *Address | 
|  | } | 
|  |  | 
|  | // GoString makes Person satisfy the GoStringer interface. | 
|  | // The return value is valid Go code that can be used to reproduce the Person struct. | 
|  | func (p Person) GoString() string { | 
|  | if p.Addr != nil { | 
|  | return fmt.Sprintf("Person{Name: %q, Age: %d, Addr: &Address{City: %q, State: %q, Country: %q}}", p.Name, int(p.Age), p.Addr.City, p.Addr.State, p.Addr.Country) | 
|  | } | 
|  | return fmt.Sprintf("Person{Name: %q, Age: %d}", p.Name, int(p.Age)) | 
|  | } | 
|  |  | 
|  | func ExampleGoStringer() { | 
|  | p1 := Person{ | 
|  | Name: "Warren", | 
|  | Age:  31, | 
|  | Addr: &Address{ | 
|  | City:    "Denver", | 
|  | State:   "CO", | 
|  | Country: "U.S.A.", | 
|  | }, | 
|  | } | 
|  | // If GoString() wasn't implemented, the output of `fmt.Printf("%#v", p1)` would be similar to | 
|  | // Person{Name:"Warren", Age:0x1f, Addr:(*main.Address)(0x10448240)} | 
|  | fmt.Printf("%#v\n", p1) | 
|  |  | 
|  | p2 := Person{ | 
|  | Name: "Theia", | 
|  | Age:  4, | 
|  | } | 
|  | // If GoString() wasn't implemented, the output of `fmt.Printf("%#v", p2)` would be similar to | 
|  | // Person{Name:"Theia", Age:0x4, Addr:(*main.Address)(nil)} | 
|  | fmt.Printf("%#v\n", p2) | 
|  |  | 
|  | // Output: | 
|  | // Person{Name: "Warren", Age: 31, Addr: &Address{City: "Denver", State: "CO", Country: "U.S.A."}} | 
|  | // Person{Name: "Theia", Age: 4} | 
|  | } |