Module lessons (1/5)
if, else, and init statements
In Go the if syntax is the classic one but with two important differences
compared to C/Java: no parentheses around the condition, and the
ability to declare a temporary variable directly in the if
(the init statement).
Basic syntax
if temperatura > 30 {
fmt.Println("caldo")
} else if temperatura > 20 {
fmt.Println("mite")
} else {
fmt.Println("fresco")
}Braces are mandatory, even for single-line blocks. The
condition must be of type bool: no "truthiness" like Python or JS.
n := 0
// if n { ... } // ERRORE: int non è bool
if n != 0 { ... } // okInit statement: scope limited to the if
You can declare a variable valid only inside if/else,
separating it from the condition with ;:
if v, err := call(); err == nil {
fmt.Println("ok", v)
} else {
fmt.Println("ko", err)
}
// qui v ed err NON esistono piùIt is the idiomatic pattern for handling errors without polluting the outer scope.
Shadowing in the if scope
If an outer variable gets "shadowed" by the init, inside the if the local version wins. Right after, the outer one re-emerges.
x := 10
if x := 3; x > 5 {
fmt.Println("dentro:", x) // mai stampato (3 < 5)
} else {
fmt.Println("else:", x) // 3
}
fmt.Println("dopo:", x) // 10 — quella esternaNo ternary operator
Go has no cond ? a : b. For conditional assignments you need an if/else
in 3-4 lines — it is a design choice to favour readability.
var label string
if age >= 18 {
label = "adulto"
} else {
label = "minore"
}Try it
Print 'positivo', 'zero' or 'negativo' depending on the value of n.
Show hint
`if / else if / else` chain with conditions on the sign.
Solution available after 3 attempts
Use the init statement to declare v := 42 in the if and print it only if v >= 18.
Show hint
Syntax: `if init; condition { ... }`.
Solution available after 3 attempts
What does this program print?
x := 10
if x := 3; x > 5 {
fmt.Println("dentro:", x)
} else {
fmt.Println("else:", x)
}
fmt.Println("dopo:", x)Recap
- Conditions without parentheses, braces always mandatory.
- The condition must be
bool: no implicit truthiness. - Init
if v, err := f(); err == nil { ... }limits the scope ofvanderr. - Shadowing in the init: be careful not to shadow outer variables.
- No ternary: write an expanded
if/else.