1// Copyright 2017 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 "io" 10 "math" 11 "os" 12 "strings" 13 "time" 14) 15 16// The Errorf function lets us use formatting features 17// to create descriptive error messages. 18func ExampleErrorf() { 19 const name, id = "bueller", 17 20 err := fmt.Errorf("user %q (id %d) not found", name, id) 21 fmt.Println(err.Error()) 22 23 // Output: user "bueller" (id 17) not found 24} 25 26func ExampleFscanf() { 27 var ( 28 i int 29 b bool 30 s string 31 ) 32 r := strings.NewReader("5 true gophers") 33 n, err := fmt.Fscanf(r, "%d %t %s", &i, &b, &s) 34 if err != nil { 35 fmt.Fprintf(os.Stderr, "Fscanf: %v\n", err) 36 } 37 fmt.Println(i, b, s) 38 fmt.Println(n) 39 // Output: 40 // 5 true gophers 41 // 3 42} 43 44func ExampleFscanln() { 45 s := `dmr 1771 1.61803398875 46 ken 271828 3.14159` 47 r := strings.NewReader(s) 48 var a string 49 var b int 50 var c float64 51 for { 52 n, err := fmt.Fscanln(r, &a, &b, &c) 53 if err == io.EOF { 54 break 55 } 56 if err != nil { 57 panic(err) 58 } 59 fmt.Printf("%d: %s, %d, %f\n", n, a, b, c) 60 } 61 // Output: 62 // 3: dmr, 1771, 1.618034 63 // 3: ken, 271828, 3.141590 64} 65 66func ExampleSscanf() { 67 var name string 68 var age int 69 n, err := fmt.Sscanf("Kim is 22 years old", "%s is %d years old", &name, &age) 70 if err != nil { 71 panic(err) 72 } 73 fmt.Printf("%d: %s, %d\n", n, name, age) 74 75 // Output: 76 // 2: Kim, 22 77} 78 79func ExamplePrint() { 80 const name, age = "Kim", 22 81 fmt.Print(name, " is ", age, " years old.\n") 82 83 // It is conventional not to worry about any 84 // error returned by Print. 85 86 // Output: 87 // Kim is 22 years old. 88} 89 90func ExamplePrintln() { 91 const name, age = "Kim", 22 92 fmt.Println(name, "is", age, "years old.") 93 94 // It is conventional not to worry about any 95 // error returned by Println. 96 97 // Output: 98 // Kim is 22 years old. 99} 100 101func ExamplePrintf() { 102 const name, age = "Kim", 22 103 fmt.Printf("%s is %d years old.\n", name, age) 104 105 // It is conventional not to worry about any 106 // error returned by Printf. 107 108 // Output: 109 // Kim is 22 years old. 110} 111 112func ExampleSprint() { 113 const name, age = "Kim", 22 114 s := fmt.Sprint(name, " is ", age, " years old.\n") 115 116 io.WriteString(os.Stdout, s) // Ignoring error for simplicity. 117 118 // Output: 119 // Kim is 22 years old. 120} 121 122func ExampleSprintln() { 123 const name, age = "Kim", 22 124 s := fmt.Sprintln(name, "is", age, "years old.") 125 126 io.WriteString(os.Stdout, s) // Ignoring error for simplicity. 127 128 // Output: 129 // Kim is 22 years old. 130} 131 132func ExampleSprintf() { 133 const name, age = "Kim", 22 134 s := fmt.Sprintf("%s is %d years old.\n", name, age) 135 136 io.WriteString(os.Stdout, s) // Ignoring error for simplicity. 137 138 // Output: 139 // Kim is 22 years old. 140} 141 142func ExampleFprint() { 143 const name, age = "Kim", 22 144 n, err := fmt.Fprint(os.Stdout, name, " is ", age, " years old.\n") 145 146 // The n and err return values from Fprint are 147 // those returned by the underlying io.Writer. 148 if err != nil { 149 fmt.Fprintf(os.Stderr, "Fprint: %v\n", err) 150 } 151 fmt.Print(n, " bytes written.\n") 152 153 // Output: 154 // Kim is 22 years old. 155 // 21 bytes written. 156} 157 158func ExampleFprintln() { 159 const name, age = "Kim", 22 160 n, err := fmt.Fprintln(os.Stdout, name, "is", age, "years old.") 161 162 // The n and err return values from Fprintln are 163 // those returned by the underlying io.Writer. 164 if err != nil { 165 fmt.Fprintf(os.Stderr, "Fprintln: %v\n", err) 166 } 167 fmt.Println(n, "bytes written.") 168 169 // Output: 170 // Kim is 22 years old. 171 // 21 bytes written. 172} 173 174func ExampleFprintf() { 175 const name, age = "Kim", 22 176 n, err := fmt.Fprintf(os.Stdout, "%s is %d years old.\n", name, age) 177 178 // The n and err return values from Fprintf are 179 // those returned by the underlying io.Writer. 180 if err != nil { 181 fmt.Fprintf(os.Stderr, "Fprintf: %v\n", err) 182 } 183 fmt.Printf("%d bytes written.\n", n) 184 185 // Output: 186 // Kim is 22 years old. 187 // 21 bytes written. 188} 189 190// Print, Println, and Printf lay out their arguments differently. In this example 191// we can compare their behaviors. Println always adds blanks between the items it 192// prints, while Print adds blanks only between non-string arguments and Printf 193// does exactly what it is told. 194// Sprint, Sprintln, Sprintf, Fprint, Fprintln, and Fprintf behave the same as 195// their corresponding Print, Println, and Printf functions shown here. 196func Example_printers() { 197 a, b := 3.0, 4.0 198 h := math.Hypot(a, b) 199 200 // Print inserts blanks between arguments when neither is a string. 201 // It does not add a newline to the output, so we add one explicitly. 202 fmt.Print("The vector (", a, b, ") has length ", h, ".\n") 203 204 // Println always inserts spaces between its arguments, 205 // so it cannot be used to produce the same output as Print in this case; 206 // its output has extra spaces. 207 // Also, Println always adds a newline to the output. 208 fmt.Println("The vector (", a, b, ") has length", h, ".") 209 210 // Printf provides complete control but is more complex to use. 211 // It does not add a newline to the output, so we add one explicitly 212 // at the end of the format specifier string. 213 fmt.Printf("The vector (%g %g) has length %g.\n", a, b, h) 214 215 // Output: 216 // The vector (3 4) has length 5. 217 // The vector ( 3 4 ) has length 5 . 218 // The vector (3 4) has length 5. 219} 220 221// These examples demonstrate the basics of printing using a format string. Printf, 222// Sprintf, and Fprintf all take a format string that specifies how to format the 223// subsequent arguments. For example, %d (we call that a 'verb') says to print the 224// corresponding argument, which must be an integer (or something containing an 225// integer, such as a slice of ints) in decimal. The verb %v ('v' for 'value') 226// always formats the argument in its default form, just how Print or Println would 227// show it. The special verb %T ('T' for 'Type') prints the type of the argument 228// rather than its value. The examples are not exhaustive; see the package comment 229// for all the details. 230func Example_formats() { 231 // A basic set of examples showing that %v is the default format, in this 232 // case decimal for integers, which can be explicitly requested with %d; 233 // the output is just what Println generates. 234 integer := 23 235 // Each of these prints "23" (without the quotes). 236 fmt.Println(integer) 237 fmt.Printf("%v\n", integer) 238 fmt.Printf("%d\n", integer) 239 240 // The special verb %T shows the type of an item rather than its value. 241 fmt.Printf("%T %T\n", integer, &integer) 242 // Result: int *int 243 244 // Println(x) is the same as Printf("%v\n", x) so we will use only Printf 245 // in the following examples. Each one demonstrates how to format values of 246 // a particular type, such as integers or strings. We start each format 247 // string with %v to show the default output and follow that with one or 248 // more custom formats. 249 250 // Booleans print as "true" or "false" with %v or %t. 251 truth := true 252 fmt.Printf("%v %t\n", truth, truth) 253 // Result: true true 254 255 // Integers print as decimals with %v and %d, 256 // or in hex with %x, octal with %o, or binary with %b. 257 answer := 42 258 fmt.Printf("%v %d %x %o %b\n", answer, answer, answer, answer, answer) 259 // Result: 42 42 2a 52 101010 260 261 // Floats have multiple formats: %v and %g print a compact representation, 262 // while %f prints a decimal point and %e uses exponential notation. The 263 // format %6.2f used here shows how to set the width and precision to 264 // control the appearance of a floating-point value. In this instance, 6 is 265 // the total width of the printed text for the value (note the extra spaces 266 // in the output) and 2 is the number of decimal places to show. 267 pi := math.Pi 268 fmt.Printf("%v %g %.2f (%6.2f) %e\n", pi, pi, pi, pi, pi) 269 // Result: 3.141592653589793 3.141592653589793 3.14 ( 3.14) 3.141593e+00 270 271 // Complex numbers format as parenthesized pairs of floats, with an 'i' 272 // after the imaginary part. 273 point := 110.7 + 22.5i 274 fmt.Printf("%v %g %.2f %.2e\n", point, point, point, point) 275 // Result: (110.7+22.5i) (110.7+22.5i) (110.70+22.50i) (1.11e+02+2.25e+01i) 276 277 // Runes are integers but when printed with %c show the character with that 278 // Unicode value. The %q verb shows them as quoted characters, %U as a 279 // hex Unicode code point, and %#U as both a code point and a quoted 280 // printable form if the rune is printable. 281 smile := '' 282 fmt.Printf("%v %d %c %q %U %#U\n", smile, smile, smile, smile, smile, smile) 283 // Result: 128512 128512 '' U+1F600 U+1F600 '' 284 285 // Strings are formatted with %v and %s as-is, with %q as quoted strings, 286 // and %#q as backquoted strings. 287 placeholders := `foo "bar"` 288 fmt.Printf("%v %s %q %#q\n", placeholders, placeholders, placeholders, placeholders) 289 // Result: foo "bar" foo "bar" "foo \"bar\"" `foo "bar"` 290 291 // Maps formatted with %v show keys and values in their default formats. 292 // The %#v form (the # is called a "flag" in this context) shows the map in 293 // the Go source format. Maps are printed in a consistent order, sorted 294 // by the values of the keys. 295 isLegume := map[string]bool{ 296 "peanut": true, 297 "dachshund": false, 298 } 299 fmt.Printf("%v %#v\n", isLegume, isLegume) 300 // Result: map[dachshund:false peanut:true] map[string]bool{"dachshund":false, "peanut":true} 301 302 // Structs formatted with %v show field values in their default formats. 303 // The %+v form shows the fields by name, while %#v formats the struct in 304 // Go source format. 305 person := struct { 306 Name string 307 Age int 308 }{"Kim", 22} 309 fmt.Printf("%v %+v %#v\n", person, person, person) 310 // Result: {Kim 22} {Name:Kim Age:22} struct { Name string; Age int }{Name:"Kim", Age:22} 311 312 // The default format for a pointer shows the underlying value preceded by 313 // an ampersand. The %p verb prints the pointer value in hex. We use a 314 // typed nil for the argument to %p here because the value of any non-nil 315 // pointer would change from run to run; run the commented-out Printf 316 // call yourself to see. 317 pointer := &person 318 fmt.Printf("%v %p\n", pointer, (*int)(nil)) 319 // Result: &{Kim 22} 0x0 320 // fmt.Printf("%v %p\n", pointer, pointer) 321 // Result: &{Kim 22} 0x010203 // See comment above. 322 323 // Arrays and slices are formatted by applying the format to each element. 324 greats := [5]string{"Kitano", "Kobayashi", "Kurosawa", "Miyazaki", "Ozu"} 325 fmt.Printf("%v %q\n", greats, greats) 326 // Result: [Kitano Kobayashi Kurosawa Miyazaki Ozu] ["Kitano" "Kobayashi" "Kurosawa" "Miyazaki" "Ozu"] 327 328 kGreats := greats[:3] 329 fmt.Printf("%v %q %#v\n", kGreats, kGreats, kGreats) 330 // Result: [Kitano Kobayashi Kurosawa] ["Kitano" "Kobayashi" "Kurosawa"] []string{"Kitano", "Kobayashi", "Kurosawa"} 331 332 // Byte slices are special. Integer verbs like %d print the elements in 333 // that format. The %s and %q forms treat the slice like a string. The %x 334 // verb has a special form with the space flag that puts a space between 335 // the bytes. 336 cmd := []byte("a⌘") 337 fmt.Printf("%v %d %s %q %x % x\n", cmd, cmd, cmd, cmd, cmd, cmd) 338 // Result: [97 226 140 152] [97 226 140 152] a⌘ "a⌘" 61e28c98 61 e2 8c 98 339 340 // Types that implement Stringer are printed the same as strings. Because 341 // Stringers return a string, we can print them using a string-specific 342 // verb such as %q. 343 now := time.Unix(123456789, 0).UTC() // time.Time implements fmt.Stringer. 344 fmt.Printf("%v %q\n", now, now) 345 // Result: 1973-11-29 21:33:09 +0000 UTC "1973-11-29 21:33:09 +0000 UTC" 346 347 // Output: 348 // 23 349 // 23 350 // 23 351 // int *int 352 // true true 353 // 42 42 2a 52 101010 354 // 3.141592653589793 3.141592653589793 3.14 ( 3.14) 3.141593e+00 355 // (110.7+22.5i) (110.7+22.5i) (110.70+22.50i) (1.11e+02+2.25e+01i) 356 // 128512 128512 '' U+1F600 U+1F600 '' 357 // foo "bar" foo "bar" "foo \"bar\"" `foo "bar"` 358 // map[dachshund:false peanut:true] map[string]bool{"dachshund":false, "peanut":true} 359 // {Kim 22} {Name:Kim Age:22} struct { Name string; Age int }{Name:"Kim", Age:22} 360 // &{Kim 22} 0x0 361 // [Kitano Kobayashi Kurosawa Miyazaki Ozu] ["Kitano" "Kobayashi" "Kurosawa" "Miyazaki" "Ozu"] 362 // [Kitano Kobayashi Kurosawa] ["Kitano" "Kobayashi" "Kurosawa"] []string{"Kitano", "Kobayashi", "Kurosawa"} 363 // [97 226 140 152] [97 226 140 152] a⌘ "a⌘" 61e28c98 61 e2 8c 98 364 // 1973-11-29 21:33:09 +0000 UTC "1973-11-29 21:33:09 +0000 UTC" 365} 366