1// Copyright 2018 The Go Authors. All rights reserved. 2// Use of this source code is governed by a BSD-style 3// license that can be found in the LICENSE file. 4 5package fmt_test 6 7import ( 8 "fmt" 9) 10 11// Address has a City, State and a Country. 12type Address struct { 13 City string 14 State string 15 Country string 16} 17 18// Person has a Name, Age and Address. 19type Person struct { 20 Name string 21 Age uint 22 Addr *Address 23} 24 25// GoString makes Person satisfy the GoStringer interface. 26// The return value is valid Go code that can be used to reproduce the Person struct. 27func (p Person) GoString() string { 28 if p.Addr != nil { 29 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) 30 } 31 return fmt.Sprintf("Person{Name: %q, Age: %d}", p.Name, int(p.Age)) 32} 33 34func ExampleGoStringer() { 35 p1 := Person{ 36 Name: "Warren", 37 Age: 31, 38 Addr: &Address{ 39 City: "Denver", 40 State: "CO", 41 Country: "U.S.A.", 42 }, 43 } 44 // If GoString() wasn't implemented, the output of `fmt.Printf("%#v", p1)` would be similar to 45 // Person{Name:"Warren", Age:0x1f, Addr:(*main.Address)(0x10448240)} 46 fmt.Printf("%#v\n", p1) 47 48 p2 := Person{ 49 Name: "Theia", 50 Age: 4, 51 } 52 // If GoString() wasn't implemented, the output of `fmt.Printf("%#v", p2)` would be similar to 53 // Person{Name:"Theia", Age:0x4, Addr:(*main.Address)(nil)} 54 fmt.Printf("%#v\n", p2) 55 56 // Output: 57 // Person{Name: "Warren", Age: 31, Addr: &Address{City: "Denver", State: "CO", Country: "U.S.A."}} 58 // Person{Name: "Theia", Age: 4} 59} 60