| // 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. | 
 |  | 
 | 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} | 
 | } |