diff options
| author | Robert Griesemer <gri@golang.org> | 2014-05-22 12:23:25 -0700 |
|---|---|---|
| committer | Robert Griesemer <gri@golang.org> | 2014-05-22 12:23:25 -0700 |
| commit | 2c83f1eaf93c3d1891588e82b4fd4e761d161fdd (patch) | |
| tree | ef101a8b9c6020b3a91c659029f078360f19f4ce /doc | |
| parent | 8d8dab34eb3bedfbb0e384deaeb03a9395db89a8 (diff) | |
| download | go-git-2c83f1eaf93c3d1891588e82b4fd4e761d161fdd.tar.gz | |
spec: explicitly disallow blank methods in interface types
The spec was unclear about whether blank methods should be
permitted in interface types. gccgo permits at most one, gc
crashes if there are more than one, go/types permits at most
one.
Discussion:
Since method sets of non-interface types never contain methods
with blank names (blank methods are never declared), it is impossible
to satisfy an interface with a blank method.
It is possible to declare variables of assignable interface types
(but not necessarily identical types) containing blank methods, and
assign those variables to each other, but the values of those
variables can only be nil.
There appear to be two "reasonable" alternatives:
1) Permit at most one blank method (since method names must be unique),
and consider it part of the interface. This is what appears to happen
now, with corner-case bugs. Such interfaces can never be implemented.
2) Permit arbitrary many blank methods but ignore them. This appears
to be closer to the handling of blank identifiers in declarations.
However, an interface type literal is not a declaration (it's a type
literal). Also, for struct types, blank identifiers are not ignored;
so the analogy with declarations is flawed.
Both these alternatives don't seem to add any benefit and are likely
(if only slightly) more complicated to explain and implement than
disallowing blank methods in interfaces altogether.
Fixes #6604.
LGTM=r, rsc, iant
R=r, rsc, ken, iant
CC=golang-codereviews
https://golang.org/cl/99410046
Diffstat (limited to 'doc')
| -rw-r--r-- | doc/go_spec.html | 23 |
1 files changed, 12 insertions, 11 deletions
diff --git a/doc/go_spec.html b/doc/go_spec.html index 4c80f39d4c..11f6a90e63 100644 --- a/doc/go_spec.html +++ b/doc/go_spec.html @@ -1,6 +1,6 @@ <!--{ "Title": "The Go Programming Language Specification", - "Subtitle": "Version of May 20, 2014", + "Subtitle": "Version of May 22, 2014", "Path": "/ref/spec" }--> @@ -696,19 +696,19 @@ and <code>T4</code> is <code>[]T1</code>. <h3 id="Method_sets">Method sets</h3> <p> -A type may have a <i>method set</i> associated with it -(§<a href="#Interface_types">Interface types</a>, §<a href="#Method_declarations">Method declarations</a>). +A type may have a <i>method set</i> associated with it. The method set of an <a href="#Interface_types">interface type</a> is its interface. -The method set of any other type <code>T</code> -consists of all methods with receiver type <code>T</code>. -The method set of the corresponding pointer type <code>*T</code> -is the set of all methods with receiver <code>*T</code> or <code>T</code> +The method set of any other type <code>T</code> consists of all +<a href="#Method_declarations">methods</a> declared with receiver type <code>T</code>. +The method set of the corresponding <a href="#Pointer_types">pointer type</a> <code>*T</code> +is the set of all methods declared with receiver <code>*T</code> or <code>T</code> (that is, it also contains the method set of <code>T</code>). Further rules apply to structs containing anonymous fields, as described in the section on <a href="#Struct_types">struct types</a>. Any other type has an empty method set. In a method set, each method must have a -<a href="#Uniqueness_of_identifiers">unique</a> <a href="#MethodName">method name</a>. +<a href="#Uniqueness_of_identifiers">unique</a> +non-<a href="#Blank_identifier">blank</a> <a href="#MethodName">method name</a>. </p> <p> @@ -818,8 +818,8 @@ ElementType = Type . </pre> <p> -The length is part of the array's type; it must evaluate to a non- -negative <a href="#Constants">constant</a> representable by a value +The length is part of the array's type; it must evaluate to a +non-negative <a href="#Constants">constant</a> representable by a value of type <code>int</code>. The length of array <code>a</code> can be discovered using the built-in function <a href="#Length_and_capacity"><code>len</code></a>. @@ -1109,7 +1109,8 @@ InterfaceTypeName = TypeName . <p> As with all method sets, in an interface type, each method must have a -<a href="#Uniqueness_of_identifiers">unique</a> name. +<a href="#Uniqueness_of_identifiers">unique</a> +non-<a href="#Blank_identifier">blank</a> name. </p> <pre> |
