]> Cypherpunks repositories - gostls13.git/commitdiff
spec: clarify embedding of interfaces
authorRobert Griesemer <gri@golang.org>
Thu, 25 Sep 2014 19:49:42 +0000 (12:49 -0700)
committerRobert Griesemer <gri@golang.org>
Thu, 25 Sep 2014 19:49:42 +0000 (12:49 -0700)
Fixes #7886.

LGTM=iant, r, rsc
R=r, iant, rsc, ken
CC=golang-codereviews
https://golang.org/cl/149010043

doc/go_spec.html

index 7d86ca863a56d4431a577f1c3a54514aab3889e4..e0ed7e7b74581dd5fd96e67e6e350aa7c16af59a 100644 (file)
@@ -1,6 +1,6 @@
 <!--{
        "Title": "The Go Programming Language Specification",
-       "Subtitle": "Version of September 19, 2014",
+       "Subtitle": "Version of September 25, 2014",
        "Path": "/ref/spec"
 }-->
 
@@ -1154,11 +1154,11 @@ interface{}
 <p>
 Similarly, consider this interface specification,
 which appears within a <a href="#Type_declarations">type declaration</a>
-to define an interface called <code>Lock</code>:
+to define an interface called <code>Locker</code>:
 </p>
 
 <pre>
-type Lock interface {
+type Locker interface {
        Lock()
        Unlock()
 }
@@ -1174,28 +1174,35 @@ func (p T) Unlock() { … }
 </pre>
 
 <p>
-they implement the <code>Lock</code> interface as well
+they implement the <code>Locker</code> interface as well
 as the <code>File</code> interface.
 </p>
+
 <p>
-An interface may use an interface type name <code>T</code>
-in place of a method specification.
-The effect, called embedding an interface,
-is equivalent to enumerating the methods of <code>T</code> explicitly
-in the interface.
+An interface <code>T</code> may use a (possibly qualified) interface type
+name <code>E</code> in place of a method specification. This is called
+<i>embedding</i> interface <code>E</code> in <code>T</code>; it adds
+all (exported and non-exported) methods of <code>E</code> to the interface
+<code>T</code>.
 </p>
 
 <pre>
-type ReadWrite interface {
+type ReadWriter interface {
        Read(b Buffer) bool
        Write(b Buffer) bool
 }
 
 type File interface {
-       ReadWrite  // same as enumerating the methods in ReadWrite
-       Lock       // same as enumerating the methods in Lock
+       ReadWriter  // same as adding the methods of ReadWriter
+       Locker      // same as adding the methods of Locker
        Close()
 }
+
+type LockedFile interface {
+       Locker
+       File        // illegal: Lock, Unlock not unique
+       Lock()      // illegal: Lock not unique
+}
 </pre>
 
 <p>