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