4. Control Structures
4.1 if-else
Program: cs1.go
1 package main
2
3 import "fmt"
4
5 func main() {
6 x, y := 30, 45
7 if x < y {
8 fmt.Println("x is less than y")
9 } else if x > y {
10 fmt.Println("x is greater than y")
11 } else {
12 fmt.Println("x is equal to y")
13 }
14 }
Run the above program and the output that you will see is:
x is less than y
Note:
- There may be zero or more
else ifclauses and zero or one finalelseclause. Each block consists of zero or more statements. - The expression after the
ifand theelse ifhas to evaluate to one of thebooltypes:trueorfalse. - There are no parentheses required around the boolean expression - you can have a parentheses, but you don’t have to have it.
-
Go requires the curly braces and the
if elsekeywords to be on the same line with the corresponding braces. If not you will see errors. - You can have the explicit values like
trueorfalse, or you can also use any expression that evaluates to atrueorfalse. - Note that types like an
intcannot be used as truth values - this is unlike languages like C, where you can use integers and pointers as truth values.
4.2 goto statement
Go has a goto statement, which you should use wisely. With goto you jump to a label which must be defined within the current function. For instance:
Program: cs2.go
1 package main
2
3 import "fmt"
4
5 func main() {
6 i := 0
7 Label: // First word on a line ending with a colon is a label
8 fmt.Println(i)
9 i++
10 if i > 50 {
11 goto Escape
12 }
13
14 goto Label // Jump
15 Escape: // Label
16 fmt.Println("Get out of here...")
17 }
The name of the label is case sensitive.
4.3 switch
The general format of the switch is:
1 switch any expression of type T {
2 case any expression of same type T: { code to be executed if the case expression is equal \
3 to the switch expression }
4 case any expression of same type T: { code to be executed if this case expression is equal\
5 to the switch expression }
6 //any number of case statements are allowed
7 default: { code to be executed if none of the case expressions match the switch expression\
8 }
9 }
Points to note:
- the type of the evaluated value in the
switchand thecaseshould match. For example, if theswitchexpression evaluates to anintand the case expression evaluates to astring, then there will be a compile error - if there is no expression at all in the
switch, then by default it isbool. The block that evaluates totrueis executed, and none of the others are executed - if more than one
casestatements match, then the first in the lexical order is executed - unlike certain other languages, each
caseblock is independent and the code does not “fall through” (each of thecasecode blocks are like independentif-elsecode blocks.) - the
defaultcode block is executed if none of the othercaseblocks match - the
caseexpressions need not be just constants and can have expressions - the use of curly braces for demarcating the code blocks is optional
- the
defaultstatement is optional - any number of
casestatements are allowed - even zerocasestatements are valid, though that wouldn’t be very useful - multiple expressions can be used, each separated by commas in the
casestatement - the
defaultblock can be anywhere within theswitchblock, and not necessarily last in the lexical order
|
Exercise 6Explain why the program displays the output as “I am true” in the following program: |
Program: cs3.go
1 package main
2
3 import "fmt"
4
5 func main() {
6 switch {
7 default: fmt.Println("I am default")
8 case false: fmt.Println("I am false")
9 case true: fmt.Println("I am true")
10 }
11 }
|
Exercise 7Explain why the following program does not compile: |
Program: cs4.go
1 package main
2
3 import "fmt"
4
5 func main() {
6 i := 5
7 switch i {
8 case 4: fmt.Println("number 4")
9 case i > 8: fmt.Println("i is > 8")
10 default: fmt.Println("default")
11 }
12 }
4.3.1 fallthrough statement
In certain languages like C and Java, the switch-case statement behaves slightly differently from Go: when a case block is executed, all the case blocks below it are also executed, unless explicitly terminated (by say using a break statement). In Go, this is not the default behavior, but if you want to achieve the same result, then use the fallthrough statement to indicate that the case block following the current one has to be executed.
1 k := 3
2 switch k {
3 case 3: fmt.Println("was <= 3"); fallthrough;
4 case 4: fmt.Println("was <= 4"); fallthrough;
5 ...
4.4 for loop
Go has only one looping construct, the for loop.
The basic for loop looks as it does in C or Java, except that the ( ) are gone (they are not even optional) and the { } are required.
There are three forms of for, only one of which has semicolons.
1 // Like a C for
2 for init; condition; post { }
3
4 // Like a C while
5 for condition { }
6
7 // Like a C for(;;)
8 for {
9 }
Here’s an example:
Program: cs5.go
1 package main
2
3 import "fmt"
4
5 func main() {
6 sum := 0
7 for i := 0; i < 100; i++ {
8 sum += i
9 }
10 fmt.Println(sum)
11 }
The output of the program is 4950.
The above program is available here1.
Here are some code snippets and their explanation:
1 func main() {
2 sum := 1
3 // As in C or Java, you can leave the
4 // pre and post statements empty.
5 for ; sum < 100; {
6 sum += sum
7 }
8 fmt.Println(sum)
9 }
1 func main() {
2 sum := 1
3 // You can drop the semicolons
4 // for behaves like C's while
5 for sum < 1000 {
6 sum += sum
7 }
8 fmt.Println(sum)
9 }
1 func main() {
2 // infinite loop
3 for {
4 }
5 }
The break keyword allows you to terminate a loop at a point and continue execution at the statement following the end of the for loop block.
An example:
Program: cs6.go
1 package main
2
3 import "fmt"
4
5 func main() {
6 i := 0
7 for {
8 if i >= 10 {
9 break
10 }
11 fmt.Println("Value of i is:", i)
12 i++
13 }
14 fmt.Println("A statement just after the for loop.")
15 }
With the continue keyword you begin the next iteration of the loop, skipping any remaining code. In the same way as break, continue also accepts a label.
The following loop prints 0 to 5.
Program: cs7.go
1 package main
2
3 import "fmt"
4
5 func main() {
6 for i := 0; i < 10; i++ {
7 if i > 5 {
8 // Skip the rest of the remaining code in the loop
9 continue
10 }
11 fmt.Println(i)
12 }
13 }
A nested for loop example:
Program: cs8.go
1 package main
2
3 import "fmt"
4
5 func main() {
6 L:
7 for {
8 for {
9 break L
10 }
11 }
12 fmt.Println("Break out of nested loops")
13 }
|
Exercise 8Write a program that uses the |
|
Exercise 9
|
|
Exercise 10Create a Go program that prints the following (up to 10 characters): |
O
OO
OOO
OOOO
OOOOO
OOOOOO
OOOOOOO
OOOOOOOO
OOOOOOOOO
OOOOOOOOOO
4.5 Solutions
Exercise 6 Reason: If there is no expression at all in the switch, then by default it is bool. The block that evaluates to true is executed, and none of the others are executed.
Exercise 7 Reason: The program will not compile as the type int and bool don’t match between the case and the switch.