I’m wondering why fallthrough isn’t allowed in a type switch statement in golang.
According to the specification: “The “fallthrough” statement is not permitted in a type switch.”, which doesn’t explain much about WHY it isn’t allowed.
The code attached is to simulate a possible scenario were a fallthrough in a type switch statement might have been useful.
Notice! This code doesn’t work, it will produce the error: “cannot fallthrough in type switch”. I’m just wondering what possible reasons might have been for not allowing the fallthrough statement in a type switch.
//A type switch question
package main
import "fmt"
//Why isn't fallthrough in type switch allowed?
func main() {
//Empty interface
var x interface{}
x = //A int, float64, bool or string value
switch i := x.(type) {
case int:
fmt.Println(i + 1)
case float64:
fmt.Println(i + 2.0)
case bool:
fallthrough
case string:
fmt.Printf("%v", i)
default:
fmt.Println("Unknown type. Sorry!")
}
}
How would you expect
fallthroughto work? In this type switch, theivariable has a type that depends on the particular case that’s invoked. So in thecase booltheivariable is typed asbool. But incase stringit’s typed asstring. So either you’re asking forito magically morph its type, which isn’t possible, or you’re asking for it to be shadowed by a new variablei string, which will have no value because its value comes fromxwhich is not, in fact, astring.Here’s an example to try and illustrate the problem:
The only possible solution would be to make the
fallthroughcause the subsequent case expression to leaveias aninterface{}, but that would be a confusing and bad definition.If you really need this behavior you can already accomplish this with the existing functionality: