github.com/yanyiwu/go@v0.0.0-20150106053140-03d6637dbb7f/test/switch.go (about) 1 // run 2 3 // Copyright 2009 The Go Authors. All rights reserved. 4 // Use of this source code is governed by a BSD-style 5 // license that can be found in the LICENSE file. 6 7 // Test switch statements. 8 9 package main 10 11 import "os" 12 13 func assert(cond bool, msg string) { 14 if !cond { 15 print("assertion fail: ", msg, "\n") 16 panic(1) 17 } 18 } 19 20 func main() { 21 i5 := 5 22 i7 := 7 23 hello := "hello" 24 25 switch true { 26 case i5 < 5: 27 assert(false, "<") 28 case i5 == 5: 29 assert(true, "!") 30 case i5 > 5: 31 assert(false, ">") 32 } 33 34 switch { 35 case i5 < 5: 36 assert(false, "<") 37 case i5 == 5: 38 assert(true, "!") 39 case i5 > 5: 40 assert(false, ">") 41 } 42 43 switch x := 5; true { 44 case i5 < x: 45 assert(false, "<") 46 case i5 == x: 47 assert(true, "!") 48 case i5 > x: 49 assert(false, ">") 50 } 51 52 switch x := 5; true { 53 case i5 < x: 54 assert(false, "<") 55 case i5 == x: 56 assert(true, "!") 57 case i5 > x: 58 assert(false, ">") 59 } 60 61 switch i5 { 62 case 0: 63 assert(false, "0") 64 case 1: 65 assert(false, "1") 66 case 2: 67 assert(false, "2") 68 case 3: 69 assert(false, "3") 70 case 4: 71 assert(false, "4") 72 case 5: 73 assert(true, "5") 74 case 6: 75 assert(false, "6") 76 case 7: 77 assert(false, "7") 78 case 8: 79 assert(false, "8") 80 case 9: 81 assert(false, "9") 82 default: 83 assert(false, "default") 84 } 85 86 switch i5 { 87 case 0, 1, 2, 3, 4: 88 assert(false, "4") 89 case 5: 90 assert(true, "5") 91 case 6, 7, 8, 9: 92 assert(false, "9") 93 default: 94 assert(false, "default") 95 } 96 97 switch i5 { 98 case 0: 99 case 1: 100 case 2: 101 case 3: 102 case 4: 103 assert(false, "4") 104 case 5: 105 assert(true, "5") 106 case 6: 107 case 7: 108 case 8: 109 case 9: 110 default: 111 assert(i5 == 5, "good") 112 } 113 114 switch i5 { 115 case 0: 116 dummy := 0 117 _ = dummy 118 fallthrough 119 case 1: 120 dummy := 0 121 _ = dummy 122 fallthrough 123 case 2: 124 dummy := 0 125 _ = dummy 126 fallthrough 127 case 3: 128 dummy := 0 129 _ = dummy 130 fallthrough 131 case 4: 132 dummy := 0 133 _ = dummy 134 assert(false, "4") 135 case 5: 136 dummy := 0 137 _ = dummy 138 fallthrough 139 case 6: 140 dummy := 0 141 _ = dummy 142 fallthrough 143 case 7: 144 dummy := 0 145 _ = dummy 146 fallthrough 147 case 8: 148 dummy := 0 149 _ = dummy 150 fallthrough 151 case 9: 152 dummy := 0 153 _ = dummy 154 fallthrough 155 default: 156 dummy := 0 157 _ = dummy 158 assert(i5 == 5, "good") 159 } 160 161 fired := false 162 switch i5 { 163 case 0: 164 dummy := 0 165 _ = dummy 166 fallthrough // tests scoping of cases 167 case 1: 168 dummy := 0 169 _ = dummy 170 fallthrough 171 case 2: 172 dummy := 0 173 _ = dummy 174 fallthrough 175 case 3: 176 dummy := 0 177 _ = dummy 178 fallthrough 179 case 4: 180 dummy := 0 181 _ = dummy 182 assert(false, "4") 183 case 5: 184 dummy := 0 185 _ = dummy 186 fallthrough 187 case 6: 188 dummy := 0 189 _ = dummy 190 fallthrough 191 case 7: 192 dummy := 0 193 _ = dummy 194 fallthrough 195 case 8: 196 dummy := 0 197 _ = dummy 198 fallthrough 199 case 9: 200 dummy := 0 201 _ = dummy 202 fallthrough 203 default: 204 dummy := 0 205 _ = dummy 206 fired = !fired 207 assert(i5 == 5, "good") 208 } 209 assert(fired, "fired") 210 211 count := 0 212 switch i5 { 213 case 0: 214 count = count + 1 215 fallthrough 216 case 1: 217 count = count + 1 218 fallthrough 219 case 2: 220 count = count + 1 221 fallthrough 222 case 3: 223 count = count + 1 224 fallthrough 225 case 4: 226 count = count + 1 227 assert(false, "4") 228 case 5: 229 count = count + 1 230 fallthrough 231 case 6: 232 count = count + 1 233 fallthrough 234 case 7: 235 count = count + 1 236 fallthrough 237 case 8: 238 count = count + 1 239 fallthrough 240 case 9: 241 count = count + 1 242 fallthrough 243 default: 244 assert(i5 == count, "good") 245 } 246 assert(fired, "fired") 247 248 switch hello { 249 case "wowie": 250 assert(false, "wowie") 251 case "hello": 252 assert(true, "hello") 253 case "jumpn": 254 assert(false, "jumpn") 255 default: 256 assert(false, "default") 257 } 258 259 fired = false 260 switch i := i5 + 2; i { 261 case i7: 262 fired = true 263 default: 264 assert(false, "fail") 265 } 266 assert(fired, "var") 267 268 // switch on nil-only comparison types 269 switch f := func() {}; f { 270 case nil: 271 assert(false, "f should not be nil") 272 default: 273 } 274 275 switch m := make(map[int]int); m { 276 case nil: 277 assert(false, "m should not be nil") 278 default: 279 } 280 281 switch a := make([]int, 1); a { 282 case nil: 283 assert(false, "m should not be nil") 284 default: 285 } 286 287 // switch on interface. 288 switch i := interface{}("hello"); i { 289 case 42: 290 assert(false, `i should be "hello"`) 291 case "hello": 292 assert(true, "hello") 293 default: 294 assert(false, `i should be "hello"`) 295 } 296 297 // switch on implicit bool converted to interface 298 // was broken: see issue 3980 299 switch i := interface{}(true); { 300 case i: 301 assert(true, "true") 302 case false: 303 assert(false, "i should be true") 304 default: 305 assert(false, "i should be true") 306 } 307 308 // switch on interface with constant cases differing by type. 309 // was rejected by compiler: see issue 4781 310 type T int 311 type B bool 312 type F float64 313 type S string 314 switch i := interface{}(float64(1.0)); i { 315 case nil: 316 assert(false, "i should be float64(1.0)") 317 case (*int)(nil): 318 assert(false, "i should be float64(1.0)") 319 case 1: 320 assert(false, "i should be float64(1.0)") 321 case T(1): 322 assert(false, "i should be float64(1.0)") 323 case F(1.0): 324 assert(false, "i should be float64(1.0)") 325 case 1.0: 326 assert(true, "true") 327 case "hello": 328 assert(false, "i should be float64(1.0)") 329 case S("hello"): 330 assert(false, "i should be float64(1.0)") 331 case true, B(false): 332 assert(false, "i should be float64(1.0)") 333 case false, B(true): 334 assert(false, "i should be float64(1.0)") 335 } 336 337 // switch on array. 338 switch ar := [3]int{1, 2, 3}; ar { 339 case [3]int{1, 2, 3}: 340 assert(true, "[1 2 3]") 341 case [3]int{4, 5, 6}: 342 assert(false, "ar should be [1 2 3]") 343 default: 344 assert(false, "ar should be [1 2 3]") 345 } 346 347 // switch on channel 348 switch c1, c2 := make(chan int), make(chan int); c1 { 349 case nil: 350 assert(false, "c1 did not match itself") 351 case c2: 352 assert(false, "c1 did not match itself") 353 case c1: 354 assert(true, "chan") 355 default: 356 assert(false, "c1 did not match itself") 357 } 358 359 // empty switch 360 switch { 361 } 362 363 // empty switch with default case. 364 fired = false 365 switch { 366 default: 367 fired = true 368 } 369 assert(fired, "fail") 370 371 // Default and fallthrough. 372 count = 0 373 switch { 374 default: 375 count++ 376 fallthrough 377 case false: 378 count++ 379 } 380 assert(count == 2, "fail") 381 382 // fallthrough to default, which is not at end. 383 count = 0 384 switch i5 { 385 case 5: 386 count++ 387 fallthrough 388 default: 389 count++ 390 case 6: 391 count++ 392 } 393 assert(count == 2, "fail") 394 395 i := 0 396 switch x := 5; { 397 case i < x: 398 os.Exit(0) 399 case i == x: 400 case i > x: 401 os.Exit(1) 402 } 403 }