教程集 www.jiaochengji.com
教程集 >  Golang编程  >  golang教程  >  正文 GO接口详解

GO接口详解

发布时间:2021-12-03   编辑:jiaochengji.com
教程集为您提供GO接口详解等资源,欢迎您收藏本站,我们将为您提供最新的GO接口详解资源
<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"/>


到此这篇关于“GO接口详解”的文章就介绍到这了,更多文章或继续浏览下面的相关文章,希望大家以后多多支持JQ教程网!

您可能感兴趣的文章:
想系统学习GO语言(Golang
Go 版本的升降级
go 获取函数地址_Go语言基础--接口浅析
基于类型系统的面向对象编程语言Go
2018年最全Go语言教程零基础入门到进阶实战视频
go 语言学习历程
14. Go 语言中的类型断言是什么?
Golang学习笔记(五):Go语言与C语言的区别
golang中的联合体
Go语言接口详解

[关闭]
~ ~