# Select-Case

## Select-Case Syntax

```fsharp
select {
    case <expr> : {
        <case body>
    }
    // or, you can declare variable(s) 
    case let <varPattern> = <expr> : {
        <case body>
    }
    // default is optional
    default: {
        <case body>
    }
}
```

## Working Example

{% tabs %}
{% tab title="Gauntlet" %}
```fsharp
package main

import "fmt" as fmt

fun Unit main() {
  let ch1 = make(chan String, 1)
  let ch2 = make(chan String, 1)

  ch1 <- "Hello from ch1"

  zero String msg
  zero Bool ok

  select {
    case let msg, ok = <-ch1: {
      if ok {
          fmt.Println("Case 1:", msg)
      } else {
          fmt.Println("ch1 closed")
      }
    }

    case <-ch2: {
      fmt.Println("Case 2: received from ch2")
    }
    default: {
      fmt.Println("Default case: nothing ready")
    }
      
  }

}
```
{% endtab %}

{% tab title="Transpiled" %}
```go
package main

import fmt "fmt"

func main() {
	ch1 := make(chan string, 1)
	ch2 := make(chan string, 1)
	ch1 <- "Hello from ch1"
	var msg string
	var ok bool
	select {
	case msg, ok := <-ch1:
		{
			if ok {
				fmt.Println("Case 1:", msg)
			} else {
				fmt.Println("ch1 closed")
			}
			// Eliminates any 'unused variable' errors
			_, _ = msg, ok
		}
	case <-ch2:
		{
			fmt.Println("Case 2: received from ch2")
		}
	default:
		{
			fmt.Println("Default case: nothing ready")
		}
	}
	// Eliminates any 'unused variable' errors
	_, _, _, _ = ch1, ch2, msg, ok

}

```
{% endtab %}

{% tab title="Output" %}
```
Case 1: Hello from ch1
```
{% endtab %}
{% endtabs %}
