COMP3007_Modern_Programming_Languages (8)
COMP3007_Modern_Programming_Languages (8)
Fall 2024-2025
2 Variable Shadowing
3 Control Structures
4 Functions in Go
5 Best Practices
6 Conclusion
1 func main () {
2 x := 10
3 fmt. Println (x) // Prints 10
4
5 {
6 x := 20 // New variable shadows outer x
7 fmt. Println (x) // Prints 20
8 }
9
10 fmt. Println (x) // Prints 10 - original x
11 }
1 func main () {
2 x := 10
3 vals := [] int {1, 2, 3}
4
5 for _, x := range vals { // x shadows outer x
6 fmt. Println (x) // Prints values from vals
7 }
8
9 fmt. Println (x) // Prints 10 - original x
10 }
1 package main
2
3 var err error // Package level error
4
5 func process () error {
6 if someCondition {
7 if err := something (); err != nil {
8 // err shadows package err
9 return err
10 }
11 }
12 return err // Which err is this?
13 }
1 // 1. Classic C-style
2 for i := 0; i < 10; i++ {
3 fmt.Println(i)
4 }
5
6 // 2. Condition -only (like while)
7 count := 0
8 for count < 5 {
9 count ++
10 }
11
12 // 3. Infinite loop
13 for {
14 // Do something forever
15 break // Exit condition
16 }
17
18 // 4. Range -based
19 nums := [] int{1, 2, 3}
20 for index , value := range nums {
21 fmt.Printf("Index: %d, Value: %d\n", index , value)
22 }
1 // Map iteration
2 colors := map[string]string{
3 "red": "#ff0000",
4 "green": "#00 ff00",
5 }
6 for key , value := range colors {
7 fmt.Printf("Key: %s, Value: %s\n", key , value)
8 }
9
10 // String iteration (by rune)
11 str := "Hello , ��"
12 for i, char := range str {
13 fmt.Printf("position %d: %c\n", i, char)
14 }
15
16 // String iteration (by byte)
17 for i := 0; i < len(str); i++ {
18 fmt.Printf("byte at %d: %x\n", i, str[i])
19 }
1 // Basic switch
2 switch day := time.Now().Weekday (); day {
3 case time.Saturday , time.Sunday:
4 fmt.Println("Weekend")
5 default :
6 fmt.Println("Weekday")
7 }
8
9 // Switch without expression (like if -else)
10 switch {
11 case hour < 12:
12 fmt.Println("Morning")
13 case hour < 17:
14 fmt.Println("Afternoon")
15 default :
16 fmt.Println("Evening")
17 }
18
19 // Type switch
20 var i interface {} = "hello"
21 switch v := i.( type) {
22 case int:
23 fmt.Printf("Integer: %v\n", v)
24 case string:
25 fmt.Printf("String: %v\n", v)
26 default :
27 fmt.Printf("Unknown type\n")
28 }
1 OuterLoop:
2 for i := 0; i < 5; i++ {
3 for j := 0; j < 5; j++ {
4 if i*j == 6 {
5 break OuterLoop // Breaks out of both loops
6 }
7 if j == 2 {
8 continue OuterLoop // Continues outer loop
9 }
10 }
11 }
12
13 // Break with label in switch
14 FindValue:
15 switch n := getValue (); n {
16 case 1:
17 if someCondition {
18 break FindValue
19 }
20 fmt.Println("One")
21 }
1 // Variadic function
2 func sum(nums ... int) int {
3 total := 0
4 for _, num := range nums {
5 total += num
6 }
7 return total
8 }
9
10 // Using slices with variadic functions
11 func main () {
12 // Direct variadic calls
13 fmt.Println(sum(1, 2, 3))
14
15 // Passing a slice
16 numbers := [] int{1, 2, 3, 4}
17 fmt.Println(sum(numbers ...))
18 }
19
20 // Mixing regular and variadic parameters
21 func printNameAndNumbers(name string , nums ... int) {
22 fmt.Printf("%s: ", name)
23 for _, num := range nums {
24 fmt.Printf("%d ", num)
25 }
26 }