| // Copyright 2017 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" | 
 | 	"io" | 
 | 	"math" | 
 | 	"os" | 
 | 	"strings" | 
 | 	"time" | 
 | ) | 
 |  | 
 | // The Errorf function lets us use formatting features | 
 | // to create descriptive error messages. | 
 | func ExampleErrorf() { | 
 | 	const name, id = "bueller", 17 | 
 | 	err := fmt.Errorf("user %q (id %d) not found", name, id) | 
 | 	fmt.Println(err.Error()) | 
 |  | 
 | 	// Output: user "bueller" (id 17) not found | 
 | } | 
 |  | 
 | func ExampleFscanf() { | 
 | 	var ( | 
 | 		i int | 
 | 		b bool | 
 | 		s string | 
 | 	) | 
 | 	r := strings.NewReader("5 true gophers") | 
 | 	n, err := fmt.Fscanf(r, "%d %t %s", &i, &b, &s) | 
 | 	if err != nil { | 
 | 		fmt.Fprintf(os.Stderr, "Fscanf: %v\n", err) | 
 | 	} | 
 | 	fmt.Println(i, b, s) | 
 | 	fmt.Println(n) | 
 | 	// Output: | 
 | 	// 5 true gophers | 
 | 	// 3 | 
 | } | 
 |  | 
 | func ExampleFscanln() { | 
 | 	s := `dmr 1771 1.61803398875 | 
 | 	ken 271828 3.14159` | 
 | 	r := strings.NewReader(s) | 
 | 	var a string | 
 | 	var b int | 
 | 	var c float64 | 
 | 	for { | 
 | 		n, err := fmt.Fscanln(r, &a, &b, &c) | 
 | 		if err == io.EOF { | 
 | 			break | 
 | 		} | 
 | 		if err != nil { | 
 | 			panic(err) | 
 | 		} | 
 | 		fmt.Printf("%d: %s, %d, %f\n", n, a, b, c) | 
 | 	} | 
 | 	// Output: | 
 | 	// 3: dmr, 1771, 1.618034 | 
 | 	// 3: ken, 271828, 3.141590 | 
 | } | 
 |  | 
 | func ExampleSscanf() { | 
 | 	var name string | 
 | 	var age int | 
 | 	n, err := fmt.Sscanf("Kim is 22 years old", "%s is %d years old", &name, &age) | 
 | 	if err != nil { | 
 | 		panic(err) | 
 | 	} | 
 | 	fmt.Printf("%d: %s, %d\n", n, name, age) | 
 |  | 
 | 	// Output: | 
 | 	// 2: Kim, 22 | 
 | } | 
 |  | 
 | func ExamplePrint() { | 
 | 	const name, age = "Kim", 22 | 
 | 	fmt.Print(name, " is ", age, " years old.\n") | 
 |  | 
 | 	// It is conventional not to worry about any | 
 | 	// error returned by Print. | 
 |  | 
 | 	// Output: | 
 | 	// Kim is 22 years old. | 
 | } | 
 |  | 
 | func ExamplePrintln() { | 
 | 	const name, age = "Kim", 22 | 
 | 	fmt.Println(name, "is", age, "years old.") | 
 |  | 
 | 	// It is conventional not to worry about any | 
 | 	// error returned by Println. | 
 |  | 
 | 	// Output: | 
 | 	// Kim is 22 years old. | 
 | } | 
 |  | 
 | func ExamplePrintf() { | 
 | 	const name, age = "Kim", 22 | 
 | 	fmt.Printf("%s is %d years old.\n", name, age) | 
 |  | 
 | 	// It is conventional not to worry about any | 
 | 	// error returned by Printf. | 
 |  | 
 | 	// Output: | 
 | 	// Kim is 22 years old. | 
 | } | 
 |  | 
 | func ExampleSprint() { | 
 | 	const name, age = "Kim", 22 | 
 | 	s := fmt.Sprint(name, " is ", age, " years old.\n") | 
 |  | 
 | 	io.WriteString(os.Stdout, s) // Ignoring error for simplicity. | 
 |  | 
 | 	// Output: | 
 | 	// Kim is 22 years old. | 
 | } | 
 |  | 
 | func ExampleSprintln() { | 
 | 	const name, age = "Kim", 22 | 
 | 	s := fmt.Sprintln(name, "is", age, "years old.") | 
 |  | 
 | 	io.WriteString(os.Stdout, s) // Ignoring error for simplicity. | 
 |  | 
 | 	// Output: | 
 | 	// Kim is 22 years old. | 
 | } | 
 |  | 
 | func ExampleSprintf() { | 
 | 	const name, age = "Kim", 22 | 
 | 	s := fmt.Sprintf("%s is %d years old.\n", name, age) | 
 |  | 
 | 	io.WriteString(os.Stdout, s) // Ignoring error for simplicity. | 
 |  | 
 | 	// Output: | 
 | 	// Kim is 22 years old. | 
 | } | 
 |  | 
 | func ExampleFprint() { | 
 | 	const name, age = "Kim", 22 | 
 | 	n, err := fmt.Fprint(os.Stdout, name, " is ", age, " years old.\n") | 
 |  | 
 | 	// The n and err return values from Fprint are | 
 | 	// those returned by the underlying io.Writer. | 
 | 	if err != nil { | 
 | 		fmt.Fprintf(os.Stderr, "Fprint: %v\n", err) | 
 | 	} | 
 | 	fmt.Print(n, " bytes written.\n") | 
 |  | 
 | 	// Output: | 
 | 	// Kim is 22 years old. | 
 | 	// 21 bytes written. | 
 | } | 
 |  | 
 | func ExampleFprintln() { | 
 | 	const name, age = "Kim", 22 | 
 | 	n, err := fmt.Fprintln(os.Stdout, name, "is", age, "years old.") | 
 |  | 
 | 	// The n and err return values from Fprintln are | 
 | 	// those returned by the underlying io.Writer. | 
 | 	if err != nil { | 
 | 		fmt.Fprintf(os.Stderr, "Fprintln: %v\n", err) | 
 | 	} | 
 | 	fmt.Println(n, "bytes written.") | 
 |  | 
 | 	// Output: | 
 | 	// Kim is 22 years old. | 
 | 	// 21 bytes written. | 
 | } | 
 |  | 
 | func ExampleFprintf() { | 
 | 	const name, age = "Kim", 22 | 
 | 	n, err := fmt.Fprintf(os.Stdout, "%s is %d years old.\n", name, age) | 
 |  | 
 | 	// The n and err return values from Fprintf are | 
 | 	// those returned by the underlying io.Writer. | 
 | 	if err != nil { | 
 | 		fmt.Fprintf(os.Stderr, "Fprintf: %v\n", err) | 
 | 	} | 
 | 	fmt.Printf("%d bytes written.\n", n) | 
 |  | 
 | 	// Output: | 
 | 	// Kim is 22 years old. | 
 | 	// 21 bytes written. | 
 | } | 
 |  | 
 | // Print, Println, and Printf lay out their arguments differently. In this example | 
 | // we can compare their behaviors. Println always adds blanks between the items it | 
 | // prints, while Print adds blanks only between non-string arguments and Printf | 
 | // does exactly what it is told. | 
 | // Sprint, Sprintln, Sprintf, Fprint, Fprintln, and Fprintf behave the same as | 
 | // their corresponding Print, Println, and Printf functions shown here. | 
 | func Example_printers() { | 
 | 	a, b := 3.0, 4.0 | 
 | 	h := math.Hypot(a, b) | 
 |  | 
 | 	// Print inserts blanks between arguments when neither is a string. | 
 | 	// It does not add a newline to the output, so we add one explicitly. | 
 | 	fmt.Print("The vector (", a, b, ") has length ", h, ".\n") | 
 |  | 
 | 	// Println always inserts spaces between its arguments, | 
 | 	// so it cannot be used to produce the same output as Print in this case; | 
 | 	// its output has extra spaces. | 
 | 	// Also, Println always adds a newline to the output. | 
 | 	fmt.Println("The vector (", a, b, ") has length", h, ".") | 
 |  | 
 | 	// Printf provides complete control but is more complex to use. | 
 | 	// It does not add a newline to the output, so we add one explicitly | 
 | 	// at the end of the format specifier string. | 
 | 	fmt.Printf("The vector (%g %g) has length %g.\n", a, b, h) | 
 |  | 
 | 	// Output: | 
 | 	// The vector (3 4) has length 5. | 
 | 	// The vector ( 3 4 ) has length 5 . | 
 | 	// The vector (3 4) has length 5. | 
 | } | 
 |  | 
 | // These examples demonstrate the basics of printing using a format string. Printf, | 
 | // Sprintf, and Fprintf all take a format string that specifies how to format the | 
 | // subsequent arguments. For example, %d (we call that a 'verb') says to print the | 
 | // corresponding argument, which must be an integer (or something containing an | 
 | // integer, such as a slice of ints) in decimal. The verb %v ('v' for 'value') | 
 | // always formats the argument in its default form, just how Print or Println would | 
 | // show it. The special verb %T ('T' for 'Type') prints the type of the argument | 
 | // rather than its value. The examples are not exhaustive; see the package comment | 
 | // for all the details. | 
 | func Example_formats() { | 
 | 	// A basic set of examples showing that %v is the default format, in this | 
 | 	// case decimal for integers, which can be explicitly requested with %d; | 
 | 	// the output is just what Println generates. | 
 | 	integer := 23 | 
 | 	// Each of these prints "23" (without the quotes). | 
 | 	fmt.Println(integer) | 
 | 	fmt.Printf("%v\n", integer) | 
 | 	fmt.Printf("%d\n", integer) | 
 |  | 
 | 	// The special verb %T shows the type of an item rather than its value. | 
 | 	fmt.Printf("%T %T\n", integer, &integer) | 
 | 	// Result: int *int | 
 |  | 
 | 	// Println(x) is the same as Printf("%v\n", x) so we will use only Printf | 
 | 	// in the following examples. Each one demonstrates how to format values of | 
 | 	// a particular type, such as integers or strings. We start each format | 
 | 	// string with %v to show the default output and follow that with one or | 
 | 	// more custom formats. | 
 |  | 
 | 	// Booleans print as "true" or "false" with %v or %t. | 
 | 	truth := true | 
 | 	fmt.Printf("%v %t\n", truth, truth) | 
 | 	// Result: true true | 
 |  | 
 | 	// Integers print as decimals with %v and %d, | 
 | 	// or in hex with %x, octal with %o, or binary with %b. | 
 | 	answer := 42 | 
 | 	fmt.Printf("%v %d %x %o %b\n", answer, answer, answer, answer, answer) | 
 | 	// Result: 42 42 2a 52 101010 | 
 |  | 
 | 	// Floats have multiple formats: %v and %g print a compact representation, | 
 | 	// while %f prints a decimal point and %e uses exponential notation. The | 
 | 	// format %6.2f used here shows how to set the width and precision to | 
 | 	// control the appearance of a floating-point value. In this instance, 6 is | 
 | 	// the total width of the printed text for the value (note the extra spaces | 
 | 	// in the output) and 2 is the number of decimal places to show. | 
 | 	pi := math.Pi | 
 | 	fmt.Printf("%v %g %.2f (%6.2f) %e\n", pi, pi, pi, pi, pi) | 
 | 	// Result: 3.141592653589793 3.141592653589793 3.14 (  3.14) 3.141593e+00 | 
 |  | 
 | 	// Complex numbers format as parenthesized pairs of floats, with an 'i' | 
 | 	// after the imaginary part. | 
 | 	point := 110.7 + 22.5i | 
 | 	fmt.Printf("%v %g %.2f %.2e\n", point, point, point, point) | 
 | 	// Result: (110.7+22.5i) (110.7+22.5i) (110.70+22.50i) (1.11e+02+2.25e+01i) | 
 |  | 
 | 	// Runes are integers but when printed with %c show the character with that | 
 | 	// Unicode value. The %q verb shows them as quoted characters, %U as a | 
 | 	// hex Unicode code point, and %#U as both a code point and a quoted | 
 | 	// printable form if the rune is printable. | 
 | 	smile := '😀' | 
 | 	fmt.Printf("%v %d %c %q %U %#U\n", smile, smile, smile, smile, smile, smile) | 
 | 	// Result: 128512 128512 😀 '😀' U+1F600 U+1F600 '😀' | 
 |  | 
 | 	// Strings are formatted with %v and %s as-is, with %q as quoted strings, | 
 | 	// and %#q as backquoted strings. | 
 | 	placeholders := `foo "bar"` | 
 | 	fmt.Printf("%v %s %q %#q\n", placeholders, placeholders, placeholders, placeholders) | 
 | 	// Result: foo "bar" foo "bar" "foo \"bar\"" `foo "bar"` | 
 |  | 
 | 	// Maps formatted with %v show keys and values in their default formats. | 
 | 	// The %#v form (the # is called a "flag" in this context) shows the map in | 
 | 	// the Go source format. Maps are printed in a consistent order, sorted | 
 | 	// by the values of the keys. | 
 | 	isLegume := map[string]bool{ | 
 | 		"peanut":    true, | 
 | 		"dachshund": false, | 
 | 	} | 
 | 	fmt.Printf("%v %#v\n", isLegume, isLegume) | 
 | 	// Result: map[dachshund:false peanut:true] map[string]bool{"dachshund":false, "peanut":true} | 
 |  | 
 | 	// Structs formatted with %v show field values in their default formats. | 
 | 	// The %+v form shows the fields by name, while %#v formats the struct in | 
 | 	// Go source format. | 
 | 	person := struct { | 
 | 		Name string | 
 | 		Age  int | 
 | 	}{"Kim", 22} | 
 | 	fmt.Printf("%v %+v %#v\n", person, person, person) | 
 | 	// Result: {Kim 22} {Name:Kim Age:22} struct { Name string; Age int }{Name:"Kim", Age:22} | 
 |  | 
 | 	// The default format for a pointer shows the underlying value preceded by | 
 | 	// an ampersand. The %p verb prints the pointer value in hex. We use a | 
 | 	// typed nil for the argument to %p here because the value of any non-nil | 
 | 	// pointer would change from run to run; run the commented-out Printf | 
 | 	// call yourself to see. | 
 | 	pointer := &person | 
 | 	fmt.Printf("%v %p\n", pointer, (*int)(nil)) | 
 | 	// Result: &{Kim 22} 0x0 | 
 | 	// fmt.Printf("%v %p\n", pointer, pointer) | 
 | 	// Result: &{Kim 22} 0x010203 // See comment above. | 
 |  | 
 | 	// Arrays and slices are formatted by applying the format to each element. | 
 | 	greats := [5]string{"Kitano", "Kobayashi", "Kurosawa", "Miyazaki", "Ozu"} | 
 | 	fmt.Printf("%v %q\n", greats, greats) | 
 | 	// Result: [Kitano Kobayashi Kurosawa Miyazaki Ozu] ["Kitano" "Kobayashi" "Kurosawa" "Miyazaki" "Ozu"] | 
 |  | 
 | 	kGreats := greats[:3] | 
 | 	fmt.Printf("%v %q %#v\n", kGreats, kGreats, kGreats) | 
 | 	// Result: [Kitano Kobayashi Kurosawa] ["Kitano" "Kobayashi" "Kurosawa"] []string{"Kitano", "Kobayashi", "Kurosawa"} | 
 |  | 
 | 	// Byte slices are special. Integer verbs like %d print the elements in | 
 | 	// that format. The %s and %q forms treat the slice like a string. The %x | 
 | 	// verb has a special form with the space flag that puts a space between | 
 | 	// the bytes. | 
 | 	cmd := []byte("a⌘") | 
 | 	fmt.Printf("%v %d %s %q %x % x\n", cmd, cmd, cmd, cmd, cmd, cmd) | 
 | 	// Result: [97 226 140 152] [97 226 140 152] a⌘ "a⌘" 61e28c98 61 e2 8c 98 | 
 |  | 
 | 	// Types that implement Stringer are printed the same as strings. Because | 
 | 	// Stringers return a string, we can print them using a string-specific | 
 | 	// verb such as %q. | 
 | 	now := time.Unix(123456789, 0).UTC() // time.Time implements fmt.Stringer. | 
 | 	fmt.Printf("%v %q\n", now, now) | 
 | 	// Result: 1973-11-29 21:33:09 +0000 UTC "1973-11-29 21:33:09 +0000 UTC" | 
 |  | 
 | 	// Output: | 
 | 	// 23 | 
 | 	// 23 | 
 | 	// 23 | 
 | 	// int *int | 
 | 	// true true | 
 | 	// 42 42 2a 52 101010 | 
 | 	// 3.141592653589793 3.141592653589793 3.14 (  3.14) 3.141593e+00 | 
 | 	// (110.7+22.5i) (110.7+22.5i) (110.70+22.50i) (1.11e+02+2.25e+01i) | 
 | 	// 128512 128512 😀 '😀' U+1F600 U+1F600 '😀' | 
 | 	// foo "bar" foo "bar" "foo \"bar\"" `foo "bar"` | 
 | 	// map[dachshund:false peanut:true] map[string]bool{"dachshund":false, "peanut":true} | 
 | 	// {Kim 22} {Name:Kim Age:22} struct { Name string; Age int }{Name:"Kim", Age:22} | 
 | 	// &{Kim 22} 0x0 | 
 | 	// [Kitano Kobayashi Kurosawa Miyazaki Ozu] ["Kitano" "Kobayashi" "Kurosawa" "Miyazaki" "Ozu"] | 
 | 	// [Kitano Kobayashi Kurosawa] ["Kitano" "Kobayashi" "Kurosawa"] []string{"Kitano", "Kobayashi", "Kurosawa"} | 
 | 	// [97 226 140 152] [97 226 140 152] a⌘ "a⌘" 61e28c98 61 e2 8c 98 | 
 | 	// 1973-11-29 21:33:09 +0000 UTC "1973-11-29 21:33:09 +0000 UTC" | 
 | } |