How to match multiple cases in switch

GolangGolangBeginner
Practice Now

Introduction

In the world of Golang programming, mastering switch case techniques is crucial for writing clean and efficient code. This tutorial explores advanced methods for matching multiple cases in switch statements, helping developers unlock more powerful and flexible conditional logic in their Go applications.


Skills Graph

%%%%{init: {'theme':'neutral'}}%%%% flowchart RL go(("Golang")) -.-> go/FunctionsandControlFlowGroup(["Functions and Control Flow"]) go/FunctionsandControlFlowGroup -.-> go/switch("Switch") subgraph Lab Skills go/switch -.-> lab-446116{{"How to match multiple cases in switch"}} end

Switch Case Basics

Introduction to Switch Statements

In Golang, the switch statement provides a powerful way to perform conditional branching. Unlike traditional if-else statements, switch cases offer a more readable and concise method for handling multiple conditions.

Basic Syntax

A basic switch statement in Go follows this structure:

switch expression {
case value1:
    // Code to execute when expression matches value1
case value2:
    // Code to execute when expression matches value2
default:
    // Code to execute when no other cases match
}

Simple Example

Here's a simple example demonstrating a basic switch statement:

package main

import "fmt"

func main() {
    day := "Monday"

    switch day {
    case "Monday":
        fmt.Println("Start of the work week")
    case "Friday":
        fmt.Println("End of the work week")
    case "Saturday", "Sunday":
        fmt.Println("Weekend!")
    default:
        fmt.Println("Midweek day")
    }
}

Key Characteristics

Feature Description
Automatic Break Go switch cases automatically break after matching
Multiple Values A single case can match multiple values
Fallthrough Keyword Use fallthrough to continue to next case

Switch Without Expression

Go also supports a switch statement without an initial expression:

switch {
case x > 0:
    fmt.Println("Positive")
case x < 0:
    fmt.Println("Negative")
default:
    fmt.Println("Zero")
}

Type Switch

Go provides a special type of switch for type checking:

func checkType(x interface{}) {
    switch x.(type) {
    case int:
        fmt.Println("Integer")
    case string:
        fmt.Println("String")
    case bool:
        fmt.Println("Boolean")
    default:
        fmt.Println("Unknown type")
    }
}

Flow Diagram

graph TD A[Start Switch] --> B{Evaluate Expression} B --> |Match Case 1| C[Execute Case 1] B --> |Match Case 2| D[Execute Case 2] B --> |No Match| E[Execute Default] C --> F[End] D --> F E --> F

By understanding these basics, you'll be well-equipped to use switch statements effectively in your Golang programs. LabEx recommends practicing these patterns to improve your switch statement skills.

Multiple Case Matching

Matching Multiple Values in a Single Case

In Golang, you can match multiple values within a single switch case, providing a concise way to handle similar conditions.

Basic Multiple Value Matching

package main

import "fmt"

func main() {
    fruit := "apple"

    switch fruit {
    case "apple", "pear", "banana":
        fmt.Println("This is a common fruit")
    case "dragon fruit", "star fruit":
        fmt.Println("This is an exotic fruit")
    default:
        fmt.Println("Unknown fruit")
    }
}

Matching Ranges

Go allows matching numeric ranges using comparison operators:

func checkScore(score int) {
    switch {
    case score >= 90:
        fmt.Println("Excellent")
    case score >= 80 && score < 90:
        fmt.Println("Very Good")
    case score >= 60 && score < 80:
        fmt.Println("Good")
    default:
        fmt.Println("Need Improvement")
    }
}

Multiple Matching Strategies

Strategy Description Example
Value Matching Match specific values case 1, 2, 3:
Range Matching Match value ranges case x > 0 && x < 10:
Conditional Matching Use complex conditions case x % 2 == 0:

Fallthrough Mechanism

The fallthrough keyword allows execution to continue to the next case:

func demonstrateFallthrough(x int) {
    switch {
    case x > 0:
        fmt.Println("Positive")
        fallthrough
    case x > 10:
        fmt.Println("Greater than 10")
    default:
        fmt.Println("Other")
    }
}

Flow of Multiple Case Matching

graph TD A[Input Value] --> B{First Case Match} B --> |Match| C[Execute First Case] B --> |No Match| D{Second Case Match} D --> |Match| E[Execute Second Case] D --> |No Match| F[Execute Default Case]

Complex Matching Example

func categorizeNumber(num int) string {
    switch {
    case num < 0:
        return "Negative"
    case num == 0:
        return "Zero"
    case num > 0 && num <= 10:
        return "Small Positive"
    case num > 10 && num <= 100:
        return "Medium Positive"
    default:
        return "Large Positive"
    }
}

By mastering multiple case matching, you'll write more elegant and efficient Golang code. LabEx encourages continuous practice to improve your switch statement skills.

Complex Switch Patterns

Type Switches

Type switches allow dynamic type checking and handling in Golang:

func handleInterface(x interface{}) {
    switch v := x.(type) {
    case int:
        fmt.Printf("Integer with value: %d\n", v)
    case string:
        fmt.Printf("String with length: %d\n", len(v))
    case []int:
        fmt.Printf("Integer slice with %d elements\n", len(v))
    default:
        fmt.Println("Unknown type")
    }
}

Nested Conditional Switches

Combining switch statements with complex conditions:

func advancedClassification(age int, status string) {
    switch {
    case age < 18:
        switch status {
        case "student":
            fmt.Println("Junior Student")
        case "employed":
            fmt.Println("Young Worker")
        }
    case age >= 18 && age < 60:
        switch status {
        case "student":
            fmt.Println("Adult Student")
        case "employed":
            fmt.Println("Working Professional")
        }
    }
}

Switch Complexity Levels

Complexity Level Description Characteristics
Basic Simple value matching Single condition
Intermediate Multiple value matching Range checks
Advanced Type switches Dynamic type handling
Complex Nested conditionals Multilevel decision making

Functional Switch Patterns

type Validator func(int) bool

func createSwitch(validators map[string]Validator) func(int) string {
    return func(num int) string {
        switch {
        case validators["positive"](num):
            return "Positive Number"
        case validators["negative"](num):
            return "Negative Number"
        case validators["zero"](num):
            return "Zero"
        default:
            return "Undefined"
        }
    }
}

Switch Flow Visualization

graph TD A[Input] --> B{Primary Switch} B --> |Condition 1| C{Secondary Switch} B --> |Condition 2| D{Type Switch} C --> |Sub-Condition 1| E[Result 1] C --> |Sub-Condition 2| F[Result 2] D --> |Type 1| G[Type-Specific Handling] D --> |Type 2| H[Another Type Handling]

Performance Considerations

func efficientSwitch(code int) string {
    switch {
    case code >= 200 && code < 300:
        return "Success"
    case code >= 400 && code < 500:
        return "Client Error"
    case code >= 500 && code < 600:
        return "Server Error"
    default:
        return "Unknown Status"
    }
}

Advanced Type Switch with Interface

type Printable interface {
    Print()
}

func smartPrint(p Printable) {
    switch v := p.(type) {
    case fmt.Stringer:
        fmt.Println(v.String())
    case Printable:
        v.Print()
    default:
        fmt.Println("Cannot print")
    }
}

By exploring these complex switch patterns, you'll develop more sophisticated and flexible Golang programming techniques. LabEx recommends continuous practice to master these advanced patterns.

Summary

By understanding multiple case matching techniques in Golang, developers can create more expressive and concise switch statements. These strategies enable more sophisticated pattern matching, reduce code complexity, and enhance the overall readability and performance of Go programming logic.