1
0
mirror of https://github.com/golang/go synced 2024-11-22 00:54:43 -07:00

- modified type switches (replacement for CL 32659)

- takes into account new scoping rules

DELTA=52  (21 added, 7 deleted, 24 changed)
OCL=33967
CL=33982
This commit is contained in:
Robert Griesemer 2009-08-27 14:22:51 -07:00
parent 9bf597a210
commit 9ecd30a286

View File

@ -3273,8 +3273,8 @@ default: return x
}
switch { // missing expression means "true"
case x < y: f1();
case x < z: f2();
case x &lt; y: f1();
case x &lt; z: f2();
case x == 4: f3();
}
</pre>
@ -3283,9 +3283,8 @@ case x == 4: f3();
<p>
A type switch compares types rather than values. It is otherwise similar
to an expression switch. It is introduced by special
notation in the form of a simple declaration whose right hand side
has the form of a type assertion (§<a href="#Type_assertions">Type assertions</a>)
to an expression switch. It is marked by a special switch expression which
has the form of a <a href="#Type_assertions">type assertion</a>
using the reserved word <code>type</code> rather than an actual type.
Cases then match literal types against the dynamic type of the expression
in the type assertion.
@ -3293,23 +3292,30 @@ in the type assertion.
<pre class="ebnf">
TypeSwitchStmt = "switch" [ [ SimpleStmt ] ";" ] TypeSwitchGuard "{" { TypeCaseClause } "}" .
TypeSwitchGuard = identifier ":=" Expression "." "(" "type" ")" .
TypeSwitchGuard = [ identifier ":=" ] Expression "." "(" "type" ")" .
TypeCaseClause = TypeSwitchCase ":" [ StatementList ] .
TypeSwitchCase = "case" Type | "default" .
</pre>
<p>
As a special case, the type in the type switch case may be an
identifier denoting the predeclared constant <code>nil</code>
<a href="#Predeclared_identifiers">Predeclared identifiers</a>).
If the interface value equals <code>nil</code>,
only an explict <code>nil</code> case or "default"
case will execute.
The TypeSwitchGuard may include a
<a href="#Short_variable_declarations">short variable declaration</a>.
When that form is used, the variable is declared in each clause.
In clauses with a case listing exactly one type, the variable
has that type; otherwise, the variable has the type of the expression
in the TypeSwitchGuard.
</p>
<p>
Given a function <code>f</code>
that returns a value of interface type,
The type in a case may be <code>nil</code>
<a href="#Predeclared_identifiers">Predeclared identifiers</a>);
that case is used when the expression in the TypeSwitchGuard
is a nil interface value.
</p>
<p>
Given a function <code>f</code> that returns
a value of type <code>interface{}</code>,
the following type switch:
</p>
@ -3323,6 +3329,8 @@ case float:
printFloat(i); // i is a float
case func(int) float:
printFunction(i); // i is a function
case bool, string:
printString("type is bool or string"); // i is an interface{}
default:
printString("don't know the type");
}
@ -3343,19 +3351,25 @@ if v == nil {
} else if i, is_func := v.(func(int) float); is_func {
printFunction(i); // i is a function
} else {
printString("don't know the type");
i1, is_bool := v.(bool);
i2, is_string := v.(string);
if is_bool || is_string {
i := v;
printString("type is bool or string"); // i is an interface{}
} else {
i := v;
printString("don't know the type"); // i is an interface{}
}
}
</pre>
<p>
In a type switch, the guard is mandatory,
there can be only one type per "case", and
the "fallthrough" statement is not allowed.
The type switch guard may be preceded by a simple statement, which
executes before the guard is evaluated.
</p>
<p>
The type switch guard may be preceded by a simple statement, which
executes before the guard is evaluated.
The "fallthrough" statement is not permitted in a type switch.
</p>
<h3 id="For_statements">For statements</h3>