<h3>1、GOLANG中的接口定义语法:</h3>
type InterfaceName interface {
//方法列表
}
<h3>2、GOLANG接口实现</h3>
golang中的接口实现不向其他语言(c /java)需要强制声明实现该接口,而是只要类中的方法包含了接口中的方法,那么该类就实现了那个接口。
<span style="color:#ff0000">java接口实现语法演示:</span>
interface Speaker {
<span style="white-space:pre"/>void speak();
}
class Cat implements Speaker //需要强制声明实现该接口
{
<span style="white-space:pre"/>@Override
<span style="white-space:pre"/>public void speak() {
<span style="white-space:pre"/>// TODO Auto-generated method stub
<span style="white-space:pre"/>//...
<span style="white-space:pre"/>}
<span style="white-space:pre"/>
}
golang接口实现语法演示:
<pre style="margin-top:0px; margin-bottom:0px"><span style="font-weight:600; color:#000080">type</span><span style="color:#c0c0c0"> </span><span style="color:#000080">LessAdder</span><span style="color:#c0c0c0"> </span><span style="font-weight:600; color:#000080">interface</span><span style="color:#c0c0c0"> </span>{</pre>
<pre style="margin-top:0px; margin-bottom:0px"><span style="color:#c0c0c0"> </span>Less(INTEGER)<span style="color:#c0c0c0"> </span><span style="color:#000080">bool</span></pre>
<pre style="margin-top:0px; margin-bottom:0px"><span style="color:#c0c0c0"> </span>Add(INTEGER)</pre>
<pre style="margin-top:0px; margin-bottom:0px">}</pre>
<pre style="margin-top:0px; margin-bottom:0px"/>
<pre style="margin-top:0px; margin-bottom:0px"><span style="font-weight:600; color:#000080">type</span><span style="color:#c0c0c0"> </span><span style="color:#000080">INTEGER</span><span style="color:#c0c0c0"> </span><span style="color:#000080">int</span></pre>
<pre style="margin-top:0px; margin-bottom:0px"/>
<pre style="margin-top:0px; margin-bottom:0px"><span style="font-weight:600; color:#000080">func</span><span style="color:#c0c0c0"> </span>(a<span style="color:#c0c0c0"> </span><span style="color:#000080">INTEGER</span>)<span style="color:#c0c0c0"> </span>Less(b<span style="color:#c0c0c0"> </span>INTEGER)<span style="color:#c0c0c0"> </span><span style="color:#000080">bool</span><span style="color:#c0c0c0"> </span>{</pre>
<pre style="margin-top:0px; margin-bottom:0px"><span style="color:#c0c0c0"> </span><span style="font-weight:600; color:#000080">return</span><span style="color:#c0c0c0"> </span>a<span style="color:#c0c0c0"> </span><<span style="color:#c0c0c0"> </span>b</pre>
<pre style="margin-top:0px; margin-bottom:0px">}</pre>
<pre style="margin-top:0px; margin-bottom:0px"/>
<pre style="margin-top:0px; margin-bottom:0px"><span style="font-weight:600; color:#000080">func</span><span style="color:#c0c0c0"> </span>(a<span style="color:#c0c0c0"> </span>*<span style="color:#000080">INTEGER</span>)<span style="color:#c0c0c0"> </span>Add(b<span style="color:#c0c0c0"> </span>INTEGER)<span style="color:#c0c0c0"> </span>{</pre>
<pre style="margin-top:0px; margin-bottom:0px"><span style="color:#c0c0c0"> </span>*a<span style="color:#c0c0c0"> </span> =<span style="color:#c0c0c0"> </span>b</pre>
<pre style="margin-top:0px; margin-bottom:0px">}</pre>
从golang实现接口的代码上可以看出,在定义类型时,无需显示声明实现该接口,甚至INTEGER类型都不知道接口LessAdder的存在。
<h3>3、GOLANG接口赋值注意事项</h3>
(1) 类型T的对象赋值给接口变量时,要求类型T的所有方法的接收器类型必须是T
(2) 类型*T的对象赋值给接口变量时,类型T的方法接收器类型可以是T或者*T
(3) 在golang中,只要两个接口具有相同的方法列表,那么他们就是等同的,就可以相互赋值;如果一个接口的方法列表包含了另一个接口的方法列表,那么可以将大的接口变量赋值给小的接口变量
<span style="color:#ff0000">类型T的对象赋值给接口变量时,要求类型T的所有方法的接收器类型必须是T</span>
e.g.
<pre style="margin-top:0px; margin-bottom:0px"><span style="font-weight:600; color:#000080"/></pre>
<pre style="margin-top:0px; margin-bottom:0px"><span style="font-weight:600; color:#000080">package</span><span style="color:#c0c0c0"> </span>main</pre>
<pre style="margin-top:0px; margin-bottom:0px"/>
<pre style="margin-top:0px; margin-bottom:0px"><span style="font-weight:600; color:#000080">import</span><span style="color:#c0c0c0"> </span><span style="color:#008000">"fmt"</span></pre>
<pre style="margin-top:0px; margin-bottom:0px"/>
<pre style="margin-top:0px; margin-bottom:0px"><span style="font-weight:600; color:#000080">type</span><span style="color:#c0c0c0"> </span><span style="color:#000080">LessAdder</span><span style="color:#c0c0c0"> </span><span style="font-weight:600; color:#000080">interface</span><span style="color:#c0c0c0"> </span>{</pre>
<pre style="margin-top:0px; margin-bottom:0px"><span style="color:#c0c0c0"> </span>Less(INTEGER)<span style="color:#c0c0c0"> </span><span style="color:#000080">bool</span></pre>
<pre style="margin-top:0px; margin-bottom:0px"><span style="color:#c0c0c0"> </span>Add(INTEGER)</pre>
<pre style="margin-top:0px; margin-bottom:0px">}</pre>
<pre style="margin-top:0px; margin-bottom:0px"/>
<pre style="margin-top:0px; margin-bottom:0px"><span style="font-weight:600; color:#000080">type</span><span style="color:#c0c0c0"> </span><span style="color:#000080">INTEGER</span><span style="color:#c0c0c0"> </span><span style="color:#000080">int</span></pre>
<pre style="margin-top:0px; margin-bottom:0px"/>
<pre style="margin-top:0px; margin-bottom:0px"><span style="font-weight:600; color:#000080">func</span><span style="color:#c0c0c0"> </span>(a<span style="color:#c0c0c0"> </span><span style="color:#000080">INTEGER</span>)<span style="color:#c0c0c0"> </span>Less(b<span style="color:#c0c0c0"> </span>INTEGER)<span style="color:#c0c0c0"> </span><span style="color:#000080">bool</span><span style="color:#c0c0c0"> </span>{</pre>
<pre style="margin-top:0px; margin-bottom:0px"><span style="color:#c0c0c0"> </span><span style="font-weight:600; color:#000080">return</span><span style="color:#c0c0c0"> </span>a<span style="color:#c0c0c0"> </span><<span style="color:#c0c0c0"> </span>b</pre>
<pre style="margin-top:0px; margin-bottom:0px">}</pre>
<pre style="margin-top:0px; margin-bottom:0px"/>
<pre style="margin-top:0px; margin-bottom:0px"><span style="font-weight:600; color:#000080">func</span><span style="color:#c0c0c0"> </span>(a<span style="color:#c0c0c0"> </span>*<span style="color:#000080">INTEGER</span>)<span style="color:#c0c0c0"> </span>Add(b<span style="color:#c0c0c0"> </span>INTEGER)<span style="color:#c0c0c0"> </span>{</pre>
<pre style="margin-top:0px; margin-bottom:0px"><span style="color:#c0c0c0"> </span>*a<span style="color:#c0c0c0"> </span> =<span style="color:#c0c0c0"> </span>b</pre>
<pre style="margin-top:0px; margin-bottom:0px">}</pre>
<pre style="margin-top:0px; margin-bottom:0px"/>
<pre style="margin-top:0px; margin-bottom:0px"><span style="font-weight:600; color:#000080">func</span><span style="color:#c0c0c0"> </span>main()<span style="color:#c0c0c0"> </span>{</pre>
<pre style="margin-top:0px; margin-bottom:0px"><span style="color:#c0c0c0"> </span><span style="font-weight:600; color:#000080">var</span><span style="color:#c0c0c0"> </span>a<span style="color:#c0c0c0"> </span>INTEGER<span style="color:#c0c0c0"> </span>=<span style="color:#c0c0c0"> </span><span style="color:#800080">10</span></pre>
<pre style="margin-top:0px; margin-bottom:0px"/>
<pre style="margin-top:0px; margin-bottom:0px"><span style="color:#c0c0c0"> </span><span style="font-weight:600; color:#000080">var</span><span style="color:#c0c0c0"> </span>b<span style="color:#c0c0c0"> </span>LessAdder<span style="color:#c0c0c0"> </span>=<span style="color:#c0c0c0"> </span>a<span style="color:#c0c0c0"> </span><span style="color:#008000">//有问题</span></pre>
<pre style="margin-top:0px; margin-bottom:0px"/>
<pre style="margin-top:0px; margin-bottom:0px"><span style="color:#c0c0c0"> </span>fmt.Println(b.Less(<span style="color:#800080">20</span>))</pre>
<pre style="margin-top:0px; margin-bottom:0px"/>
<pre style="margin-top:0px; margin-bottom:0px"><span style="color:#c0c0c0"> </span>b.Add(<span style="color:#800080">40</span>)</pre>
<pre style="margin-top:0px; margin-bottom:0px"/>
<pre style="margin-top:0px; margin-bottom:0px"><span style="color:#c0c0c0"> </span>fmt.Println(a)</pre>
<pre style="margin-top:0px; margin-bottom:0px">}</pre>
<pre style="margin-top:0px; margin-bottom:0px"/>
<pre style="margin-top:0px; margin-bottom:0px"/>
<pre style="margin-top:0px; margin-bottom:0px"/>
编译运行:
<span style="font-weight:600; color:rgb(0,0,128)">C:/go/bin/go.exe run test.go [E:/project/go/lx/src]</span>
# command-line-arguments
.\test.go:23: cannot use a (type INTEGER) as type LessAdder in assignment:
INTEGER does not implement LessAdder (Add method has pointer receiver)
<span style="font-weight:600; color:rgb(255,0,0)">错误: 进程退出代码 2.</span>
e.g.
<pre style="margin-top:0px; margin-bottom:0px"><span style="font-weight:600; color:#000080">package</span><span style="color:#c0c0c0"> </span>main</pre>
<pre style="margin-top:0px; margin-bottom:0px"/>
<pre style="margin-top:0px; margin-bottom:0px"><span style="font-weight:600; color:#000080">import</span><span style="color:#c0c0c0"> </span><span style="color:#008000">"fmt"</span></pre>
<pre style="margin-top:0px; margin-bottom:0px"/>
<pre style="margin-top:0px; margin-bottom:0px"><span style="font-weight:600; color:#000080">type</span><span style="color:#c0c0c0"> </span><span style="color:#000080">LessAdder</span><span style="color:#c0c0c0"> </span><span style="font-weight:600; color:#000080">interface</span><span style="color:#c0c0c0"> </span>{</pre>
<pre style="margin-top:0px; margin-bottom:0px"><span style="color:#c0c0c0"> </span>Less(INTEGER)<span style="color:#c0c0c0"> </span><span style="color:#000080">bool</span></pre>
<pre style="margin-top:0px; margin-bottom:0px"><span style="color:#c0c0c0"> </span>Add(INTEGER)</pre>
<pre style="margin-top:0px; margin-bottom:0px">}</pre>
<pre style="margin-top:0px; margin-bottom:0px"/>
<pre style="margin-top:0px; margin-bottom:0px"><span style="font-weight:600; color:#000080">type</span><span style="color:#c0c0c0"> </span><span style="color:#000080">INTEGER</span><span style="color:#c0c0c0"> </span><span style="color:#000080">int</span></pre>
<pre style="margin-top:0px; margin-bottom:0px"/>
<pre style="margin-top:0px; margin-bottom:0px"><span style="font-weight:600; color:#000080">func</span><span style="color:#c0c0c0"> </span>(a<span style="color:#c0c0c0"> </span><span style="color:#000080">INTEGER</span>)<span style="color:#c0c0c0"> </span>Less(b<span style="color:#c0c0c0"> </span>INTEGER)<span style="color:#c0c0c0"> </span><span style="color:#000080">bool</span><span style="color:#c0c0c0"> </span>{</pre>
<pre style="margin-top:0px; margin-bottom:0px"><span style="color:#c0c0c0"> </span><span style="font-weight:600; color:#000080">return</span><span style="color:#c0c0c0"> </span>a<span style="color:#c0c0c0"> </span><<span style="color:#c0c0c0"> </span>b</pre>
<pre style="margin-top:0px; margin-bottom:0px">}</pre>
<pre style="margin-top:0px; margin-bottom:0px"/>
<pre style="margin-top:0px; margin-bottom:0px"><span style="font-weight:600; color:#000080">func</span><span style="color:#c0c0c0"> </span>(a<span style="color:#c0c0c0"> </span><span style="color:#000080">INTEGER</span>)<span style="color:#c0c0c0"> </span>Add(b<span style="color:#c0c0c0"> </span>INTEGER)<span style="color:#c0c0c0"> </span>{<span style="color:#c0c0c0"> </span><span style="color:#008000">//该方法修改的是形参a的值,并没有真正修改main函数中的变量a</span></pre>
<pre style="margin-top:0px; margin-bottom:0px"><span style="color:#c0c0c0"> </span>a<span style="color:#c0c0c0"> </span> =<span style="color:#c0c0c0"> </span>b</pre>
<pre style="margin-top:0px; margin-bottom:0px">}</pre>
<pre style="margin-top:0px; margin-bottom:0px"/>
<pre style="margin-top:0px; margin-bottom:0px"><span style="font-weight:600; color:#000080">func</span><span style="color:#c0c0c0"> </span>main()<span style="color:#c0c0c0"> </span>{</pre>
<pre style="margin-top:0px; margin-bottom:0px"><span style="color:#c0c0c0"> </span><span style="font-weight:600; color:#000080">var</span><span style="color:#c0c0c0"> </span>a<span style="color:#c0c0c0"> </span>INTEGER<span style="color:#c0c0c0"> </span>=<span style="color:#c0c0c0"> </span><span style="color:#800080">10</span></pre>
<pre style="margin-top:0px; margin-bottom:0px"/>
<pre style="margin-top:0px; margin-bottom:0px"><span style="color:#c0c0c0"> </span><span style="font-weight:600; color:#000080">var</span><span style="color:#c0c0c0"> </span>b<span style="color:#c0c0c0"> </span>LessAdder<span style="color:#c0c0c0"> </span>=<span style="color:#c0c0c0"> </span>a</pre>
<pre style="margin-top:0px; margin-bottom:0px"/>
<pre style="margin-top:0px; margin-bottom:0px"><span style="color:#c0c0c0"> </span>fmt.Println(b.Less(<span style="color:#800080">20</span>))</pre>
<pre style="margin-top:0px; margin-bottom:0px"/>
<pre style="margin-top:0px; margin-bottom:0px"><span style="color:#c0c0c0"> </span>b.Add(<span style="color:#800080">40</span>)</pre>
<pre style="margin-top:0px; margin-bottom:0px"/>
<pre style="margin-top:0px; margin-bottom:0px"><span style="color:#c0c0c0"> </span>fmt.Println(a)</pre>
<pre style="margin-top:0px; margin-bottom:0px">}</pre>
<pre style="margin-top:0px; margin-bottom:0px"/> 编译运行:
<span style="font-weight:600; color:rgb(0,0,128)">C:/go/bin/go.exe run test.go [E:/project/go/lx/src]</span>
true
10
<span style="font-weight:600; color:rgb(0,0,128)">成功: 进程退出代码 0.</span>
OK,这次编译通过,但是这段代码是有问题的,参见代码注释。
<span style="color:#ff0000">类型*T的对象赋值给接口变量时,类型T的方法接收器类型可以是T或者*T</span>
e.g.
<pre style="margin-top:0px; margin-bottom:0px"><pre style="margin-top:0px; margin-bottom:0px"><span style="font-weight:600; color:#000080">package</span><span style="color:#c0c0c0"> </span>main</pre><pre style="margin-top:0px; margin-bottom:0px"/><pre style="margin-top:0px; margin-bottom:0px"><span style="font-weight:600; color:#000080">import</span><span style="color:#c0c0c0"> </span><span style="color:#008000">"fmt"</span></pre><pre style="margin-top:0px; margin-bottom:0px"/><pre style="margin-top:0px; margin-bottom:0px"><span style="font-weight:600; color:#000080">type</span><span style="color:#c0c0c0"> </span><span style="color:#000080">LessAdder</span><span style="color:#c0c0c0"> </span><span style="font-weight:600; color:#000080">interface</span><span style="color:#c0c0c0"> </span>{</pre><pre style="margin-top:0px; margin-bottom:0px"><span style="color:#c0c0c0"> </span>Less(INTEGER)<span style="color:#c0c0c0"> </span><span style="color:#000080">bool</span></pre><pre style="margin-top:0px; margin-bottom:0px"><span style="color:#c0c0c0"> </span>Add(INTEGER)</pre><pre style="margin-top:0px; margin-bottom:0px">}</pre><pre style="margin-top:0px; margin-bottom:0px"/><pre style="margin-top:0px; margin-bottom:0px"><span style="font-weight:600; color:#000080">type</span><span style="color:#c0c0c0"> </span><span style="color:#000080">INTEGER</span><span style="color:#c0c0c0"> </span><span style="color:#000080">int</span></pre><pre style="margin-top:0px; margin-bottom:0px"/><pre style="margin-top:0px; margin-bottom:0px"><span style="font-weight:600; color:#000080">func</span><span style="color:#c0c0c0"> </span>(a<span style="color:#c0c0c0"> </span><span style="color:#000080">INTEGER</span>)<span style="color:#c0c0c0"> </span>Less(b<span style="color:#c0c0c0"> </span>INTEGER)<span style="color:#c0c0c0"> </span><span style="color:#000080">bool</span><span style="color:#c0c0c0"> </span>{<span style="color:#c0c0c0"> </span><span style="color:#008000">//接收器类型为INTEGER</span></pre><pre style="margin-top:0px; margin-bottom:0px"><span style="color:#c0c0c0"> </span><span style="font-weight:600; color:#000080">return</span><span style="color:#c0c0c0"> </span>a<span style="color:#c0c0c0"> </span><<span style="color:#c0c0c0"> </span>b</pre><pre style="margin-top:0px; margin-bottom:0px">}</pre><pre style="margin-top:0px; margin-bottom:0px"/><pre style="margin-top:0px; margin-bottom:0px"><span style="font-weight:600; color:#000080">func</span><span style="color:#c0c0c0"> </span>(a<span style="color:#c0c0c0"> </span>*<span style="color:#000080">INTEGER</span>)<span style="color:#c0c0c0"> </span>Add(b<span style="color:#c0c0c0"> </span>INTEGER)<span style="color:#c0c0c0"> </span>{<span style="color:#c0c0c0"> </span><span style="color:#008000">//接收器类型为*INTEGER</span></pre><pre style="margin-top:0px; margin-bottom:0px"><span style="color:#c0c0c0"> </span>*a<span style="color:#c0c0c0"> </span> =<span style="color:#c0c0c0"> </span>b</pre><pre style="margin-top:0px; margin-bottom:0px">}</pre><pre style="margin-top:0px; margin-bottom:0px"/><pre style="margin-top:0px; margin-bottom:0px"><span style="font-weight:600; color:#000080">func</span><span style="color:#c0c0c0"> </span>main()<span style="color:#c0c0c0"> </span>{</pre><pre style="margin-top:0px; margin-bottom:0px"><span style="color:#c0c0c0"> </span><span style="font-weight:600; color:#000080">var</span><span style="color:#c0c0c0"> </span>a<span style="color:#c0c0c0"> </span>INTEGER<span style="color:#c0c0c0"> </span>=<span style="color:#c0c0c0"> </span><span style="color:#800080">10</span></pre><pre style="margin-top:0px; margin-bottom:0px"/><pre style="margin-top:0px; margin-bottom:0px"><span style="color:#c0c0c0"> </span><span style="font-weight:600; color:#000080">var</span><span style="color:#c0c0c0"> </span>b<span style="color:#c0c0c0"> </span>LessAdder<span style="color:#c0c0c0"> </span>=<span style="color:#c0c0c0"> </span>&a</pre><pre style="margin-top:0px; margin-bottom:0px"/><pre style="margin-top:0px; margin-bottom:0px"><span style="color:#c0c0c0"> </span>fmt.Println(b.Less(<span style="color:#800080">20</span>))</pre><pre style="margin-top:0px; margin-bottom:0px"/><pre style="margin-top:0px; margin-bottom:0px"><span style="color:#c0c0c0"> </span>b.Add(<span style="color:#800080">40</span>)</pre><pre style="margin-top:0px; margin-bottom:0px"/><pre style="margin-top:0px; margin-bottom:0px"><span style="color:#c0c0c0"> </span>fmt.Println(a)</pre><pre style="margin-top:0px; margin-bottom:0px">}</pre><pre style="margin-top:0px; margin-bottom:0px"/>编译运行:</pre>
<pre style="margin-top:0px; margin-bottom:0px">
<span style="font-weight:600; color:rgb(0,0,128)">C:/go/bin/go.exe run test.go [E:/project/go/lx/src]</span>
true
50
<span style="font-weight:600; color:rgb(0,0,128)">成功: 进程退出代码 0.</span>
OK。从上面的代码可以看出,当接口变量的值是*T时,接收器的类型可以是T或*T
<span style="color:#ff0000">
</span>
<span style="color:#ff0000">在golang中,只要两个接口具有相同的方法列表,那么他们就是等同的,就可以相互赋值;</span>
<span style="color:#ff0000">如果一个接口的方法列表包含了另一个接口的方法列表,那么可以将大的接口变量赋值给小的接口变量。</span><span style="color:#000080">
</span>
e.g.
<pre style="margin-top:0px; margin-bottom:0px"><span style="font-weight:600; color:#000080">package</span><span style="color:#c0c0c0"> </span>one</pre><pre style="margin-top:0px; margin-bottom:0px"/><pre style="margin-top:0px; margin-bottom:0px"><span style="font-weight:600; color:#000080">type</span><span style="color:#c0c0c0"> </span><span style="color:#000080">ReadWriter</span><span style="color:#c0c0c0"> </span><span style="font-weight:600; color:#000080">interface</span><span style="color:#c0c0c0"> </span>{</pre><pre style="margin-top:0px; margin-bottom:0px"><span style="color:#c0c0c0"> </span>Read(buff<span style="color:#c0c0c0"> </span>[]<span style="color:#000080">byte</span>)<span style="color:#c0c0c0"> </span>(n<span style="color:#c0c0c0"> </span><span style="color:#000080">int</span>,<span style="color:#c0c0c0"> </span>err<span style="color:#c0c0c0"> </span><span style="color:#000080">error</span>)</pre><pre style="margin-top:0px; margin-bottom:0px"><span style="color:#c0c0c0"> </span>Write(buff<span style="color:#c0c0c0"> </span>[]<span style="color:#000080">byte</span>)<span style="color:#c0c0c0"> </span>(n<span style="color:#c0c0c0"> </span><span style="color:#000080">int</span>,<span style="color:#c0c0c0"> </span>err<span style="color:#c0c0c0"> </span><span style="color:#000080">error</span>)</pre><pre style="margin-top:0px; margin-bottom:0px">}</pre>
<pre style="margin-top:0px; margin-bottom:0px"><span style="font-weight:600; color:#000080">package</span><span style="color:#c0c0c0"> </span>two</pre><pre style="margin-top:0px; margin-bottom:0px"/><pre style="margin-top:0px; margin-bottom:0px"><span style="font-weight:600; color:#000080">type</span><span style="color:#c0c0c0"> </span><span style="color:#000080">IStream</span><span style="color:#c0c0c0"> </span><span style="font-weight:600; color:#000080">interface</span><span style="color:#c0c0c0"> </span>{</pre><pre style="margin-top:0px; margin-bottom:0px"><span style="color:#c0c0c0"> </span>Write(buff<span style="color:#c0c0c0"> </span>[]<span style="color:#000080">byte</span>)<span style="color:#c0c0c0"> </span>(n<span style="color:#c0c0c0"> </span><span style="color:#000080">int</span>,<span style="color:#c0c0c0"> </span>err<span style="color:#c0c0c0"> </span><span style="color:#000080">error</span>)</pre><pre style="margin-top:0px; margin-bottom:0px"><span style="color:#c0c0c0"> </span>Read(buff<span style="color:#c0c0c0"> </span>[]<span style="color:#000080">byte</span>)<span style="color:#c0c0c0"> </span>(n<span style="color:#c0c0c0"> </span><span style="color:#000080">int</span>,<span style="color:#c0c0c0"> </span>err<span style="color:#c0c0c0"> </span><span style="color:#000080">error</span>)</pre><pre style="margin-top:0px; margin-bottom:0px">}</pre>
上面定义的接口one.ReadWriter和two.IStream就是等价的,对应的接口变量可以相互赋值。
<pre style="margin-top:0px; margin-bottom:0px"><span style="color:#c0c0c0"> </span><span style="font-weight:600; color:#000080">var</span><span style="color:#c0c0c0"> </span>file1<span style="color:#c0c0c0"> </span>one.ReadWriter=<span style="color:#000080">new</span>(os.File)</pre><pre style="margin-top:0px; margin-bottom:0px"><span style="color:#c0c0c0"> </span><span style="font-weight:600; color:#000080">var</span><span style="color:#c0c0c0"> </span>file2<span style="color:#c0c0c0"> </span>two.IStream=file1</pre><pre style="margin-top:0px; margin-bottom:0px"><span style="color:#c0c0c0"> </span><span style="font-weight:600; color:#000080">var</span><span style="color:#c0c0c0"> </span>file3<span style="color:#c0c0c0"> </span>one.ReadWriter=file2</pre>
e.g.
<pre style="margin-top:0px; margin-bottom:0px"><span style="font-weight:600; color:#000080">package</span><span style="color:#c0c0c0"> </span>three</pre><pre style="margin-top:0px; margin-bottom:0px"/><pre style="margin-top:0px; margin-bottom:0px"><span style="font-weight:600; color:#000080">type</span><span style="color:#c0c0c0"> </span><span style="color:#000080">Writer</span><span style="color:#c0c0c0"> </span><span style="font-weight:600; color:#000080">interface</span><span style="color:#c0c0c0"> </span>{</pre><pre style="margin-top:0px; margin-bottom:0px"><span style="color:#c0c0c0"> </span>Write([]<span style="color:#000080">byte</span>)<span style="color:#c0c0c0"> </span>(<span style="color:#000080">int</span>,<span style="color:#c0c0c0"> </span><span style="color:#000080">error</span>)</pre><pre style="margin-top:0px; margin-bottom:0px">}</pre>
<pre style="margin-top:0px; margin-bottom:0px">
</pre><pre style="margin-top:0px; margin-bottom:0px">上面定义的Writer接口是one.ReadWriter和two.IStream接口的子接口,所以可以将one.ReadWriter和two.IStream类型变量赋值给three.Writer接口变量。</pre><pre style="margin-top:0px; margin-bottom:0px"><span style="color:#c0c0c0"> </span><span style="font-weight:600; color:#000080">var</span><span style="color:#c0c0c0"> </span>file1<span style="color:#c0c0c0"> </span>one.ReadWriter=<span style="color:#000080">new</span>(os.File)</pre><pre style="margin-top:0px; margin-bottom:0px"><span style="color:#c0c0c0"> </span><span style="font-weight:600; color:#000080">var</span><span style="color:#c0c0c0"> </span>file2<span style="color:#c0c0c0"> </span>three.Writer=file1</pre>
</pre>
<pre style="margin-top:0px; margin-bottom:0px"/>
<blockquote class="layui-elem-quote" style="width: 100%;overflow:hidden">
作者: wo198711203217
链接: https://blog.csdn.net/wo198711203217/article/details/72779377
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。
</blockquote>
到此这篇关于“GO接口详解”的文章就介绍到这了,更多文章或继续浏览下面的相关文章,希望大家以后多多支持JQ教程网!
您可能感兴趣的文章:
想系统学习GO语言(Golang
Go 版本的升降级
go 获取函数地址_Go语言基础--接口浅析
基于类型系统的面向对象编程语言Go
2018年最全Go语言教程零基础入门到进阶实战视频
go 语言学习历程
14. Go 语言中的类型断言是什么?
Golang学习笔记(五):Go语言与C语言的区别
golang中的联合体
Go语言接口详解