Go语言接口定义与用法示例

本文实例讲述了Go语言接口定义与用法。分享给大家供大家参考,具体如下:

在Go中,接口interface其实和其他语言的接口意思也没什么区别。interface理解其为一种类型的规范或者约定。一种类型是不是“实现”了一个接口呢?就看这种类型是不是实现了接口中定义的所有方法。

1. 接口的定义和使用。

比如

代码如下:

type I interface{
    Get() int
    Put(int)
}

这段话就定义了一个接口,它包含两个函数Get和Put

好了,我的一个接口实现了这个接口:

代码如下:

type S struct {val int}
func (this *S) Get int {
    return this.val
}
func (this *S)Put(v int) {
    this.val = v
}

这个结构S就是实现了接口I

2. 空接口

对于空接口interface{} 其实和泛型的概念很像。任何类型都实现了空接口。

下面举个例子:

一个函数实现这样的功能:

以任何对象作为参数,如果这个对象是实现了接口I,那么就调用接口I的Get方法

很多语言都是这样的逻辑:

代码如下:

function g(obj){
    if (obj is I) {
        return (I)obj.Get()
    }
}

Go中是这样实现的:

代码如下:

func g(any interface{}) int {
    return any.(I).Get()
}

这里的any.(I)是不是很语义化?“任何实现了I接口的对象”

3. Go中interface的写法:

下面看几个interface的例子:

代码如下:

func SomeFunction(w interface{Write(string)}){
    w.Write("pizza")
}

这个例子中,直接将interface定义在参数中,很特别…

代码如下:

func weirdFunc( i int ) interface{} {
  if i ==  0 {
    return "zero"
  }
  return i;
}

这里例子中,由于有可能返回string,也有可能返回int,因此将返回值设置成为interface,这个在Go的package包中会大量见到。

希望本文所述对大家Go语言程序设计有所帮助。

(0)

相关推荐

  • Go语言服务器开发实现最简单HTTP的GET与POST接口

    本文实例讲述了Go语言服务器开发实现最简单HTTP的GET与POST接口.分享给大家供大家参考.具体分析如下: Go语言提供了http包,可以很轻松的开发http接口.以下为示例代码: 复制代码 代码如下: package webserver    import (      "encoding/json"      "fmt"      "net/http"      "time"  )    func WebServerB

  • go语言接口用法实例分析

    本文实例讲述了go语言接口用法.分享给大家供大家参考.具体分析如下: 首先定义一个接口: 复制代码 代码如下: type I interface{     Get() int     Put(int)   } 这段话就定义了一个接口,它包含两个函数Get和Put 好了,我的一个接口实现了这个接口: 复制代码 代码如下: type S stuct {val int} func (this *S) Get int {     return this.val } func (this *S)Put(v

  • Go语言接口用法实例

    本文实例讲述了Go语言接口用法.分享给大家供大家参考.具体分析如下: 接口类型是由一组方法定义的集合. 接口类型的值可以存放实现这些方法的任何值. 复制代码 代码如下: package main import (     "fmt"     "math" ) type Abser interface {     Abs() float64 } func main() {     var a Abser     f := MyFloat(-math.Sqrt2)   

  • Go语言中接口组合的实现方法

    本文实例讲述了Go语言中接口组合的实现方法.分享给大家供大家参考.具体实现方法如下: 在Go语言中,可以在接口A中组合其它的一个或多个接口(如接口B.C),这种方式等价于在接口A中添加接口B.C中声明的方法. 复制代码 代码如下: //接口中可以组合其它接口,这种方式等效于在接口中添加其它接口的方法  type Reader interface {      read()  }  type Writer interface {      write()  }    //定义上述两个接口的实现类 

  • Go语言中的方法、接口和嵌入类型详解

    概述 在 Go 语言中,如果一个结构体和一个嵌入字段同时实现了相同的接口会发生什么呢?我们猜一下,可能有两个问题: 1.编译器会因为我们同时有两个接口实现而报错吗? 2.如果编译器接受这样的定义,那么当接口调用时编译器要怎么确定该使用哪个实现? 在写了一些测试代码并认真深入的读了一下标准之后,我发现了一些有意思的东西,而且觉得很有必要分享出来,那么让我们先从 Go 语言中的方法开始说起. 方法 Go 语言中同时有函数和方法.一个方法就是一个包含了接受者的函数,接受者可以是命名类型或者结构体类型的

  • Go语言排序与接口实例分析

    本文实例讲述了Go语言排序与接口用法.分享给大家供大家参考.具体如下: 复制代码 代码如下: import "fmt" type Sorter interface {   Len() int   Less(i, j int) bool   Swap(i, j int) } type Xi []int type Xs []string func (p Xi) Len() int { return len(p) } func (p Xi) Less(i int, j int) bool {

  • Go语言接口定义与用法示例

    本文实例讲述了Go语言接口定义与用法.分享给大家供大家参考,具体如下: 在Go中,接口interface其实和其他语言的接口意思也没什么区别.interface理解其为一种类型的规范或者约定.一种类型是不是"实现"了一个接口呢?就看这种类型是不是实现了接口中定义的所有方法. 1. 接口的定义和使用. 比如 复制代码 代码如下: type I interface{     Get() int     Put(int) } 这段话就定义了一个接口,它包含两个函数Get和Put 好了,我的一

  • Android编程图片操作类定义与用法示例【拍照,相册选图及裁剪】

    本文实例讲述了Android编程图片操作类定义与用法.分享给大家供大家参考,具体如下: 主界面类:拍照及选择相册图片 import android.app.Activity; import android.content.Intent; import android.graphics.Bitmap; import android.net.Uri; import android.os.Bundle; import android.provider.MediaStore; import androi

  • java抽象类和接口定义与用法详解

    本文实例讲述了java抽象类和接口定义与用法.分享给大家供大家参考,具体如下: 抽象类 抽象类定义 只约定类所具有的抽象行为,没有具体实现相应行为. 语法格式 abstract class 类名{ 常量; 变量; 构造(); 访问修饰符abstract 返回类型 方法名;//抽象方法 普通方法; 静态方法(); } 应用场景 1.不适合创建对象. 2.有些功能没有必要实现,有不同的子类实现. 3.每次使用的都是子类的对象. 4.为所有的子类提供了一个模板,所有的子类都是在此模板的基础之上添加和修

  • javascript递归函数定义和用法示例分析

    递归函数:是指函数直接或间接调用函数本身,则称该函数为递归函数. 这句话理解起来并不难,从概念上出发,给出以下的例子: function foo(){ console.log("函数 foo 是递归函数."); foo(); } 这个例子的 foo 函数就是一个递归函数. 当你把这个函数拿到浏览器上运行的时候,你会发现内存溢出了,为什么呢?因为这个递归函数没有停止处理或运算的出口,因此这个递归函数就演变为一个死循环. 那如何使用递归呢? 使用递归函数必须要符合两个条件: 1. 在每一次

  • java中的抽象类和接口定义与用法详解

    目录 一.抽象类 1.什么叫抽象类? 2.抽象类的特点: 3.成员特点: 二.接口 1.接口是什么? 2.接口的特点 3.接口的组成成员 4.类与抽象的关系: 5.抽象类与接口的区别: 一.抽象类 1.什么叫抽象类? 例如在生活中我们都把狗和猫归为动物着一类中,但当只说动物时,我们是不知道是猫还是狗还是其他的.所以动物就是所谓的抽象类,猫和狗则是具体的类了.因此在Java中,一个没有方法体的方法应该定义为抽象类,而类中有抽象方法,则必须为抽象类. 2.抽象类的特点: 抽象类与抽象方法必须用abs

  • Java数据结构之稀疏矩阵定义与用法示例

    本文实例讲述了Java数据结构之稀疏矩阵定义与用法.分享给大家供大家参考,具体如下: 稀疏矩阵非零元素的三元组类: package com.clarck.datastructure.matrix; /** * 稀疏矩阵的压缩存储 * * 稀疏矩阵非零元素的三元组类 * * @author clarck * */ public class Triple implements Comparable<Triple> { // 行号,列号, 元素值,默认访问权限 int row, colum, val

  • PHP双向链表定义与用法示例

    本文实例讲述了PHP双向链表定义与用法.分享给大家供大家参考,具体如下: 由于需要对一组数据多次进行移动操作,所以写个双向链表.但对php实在不熟悉,虽然测试各个方法没啥问题,就是不知道php语言深层的这些指针和unset有什么注意的地方,贴出来让大家教育吧.效率没测试....求谅解- <?php /** * **双向链表 * @author zhiyuan12@ */ /** * 链表元素结点类 */ class Node_Element { public $pre = NULL; // 前驱

  • PHP基于redis计数器类定义与用法示例

    本文实例讲述了PHP基于redis计数器类定义与用法.分享给大家供大家参考,具体如下: Redis是一个开源的使用ANSI C语言编写.支持网络.可基于内存亦可持久化的日志型.Key-Value数据库,并提供多种语言的API. 这里使用其incr(自增),get(获取),delete(清除)方法来实现计数器类. 1.Redis计数器类代码及演示实例 RedisCounter.class.php <?php /** * PHP基于Redis计数器类 * Date: 2017-10-28 * Aut

  • Python抽象和自定义类定义与用法示例

    本文实例讲述了Python抽象和自定义类定义与用法.分享给大家供大家参考,具体如下: 抽象方法 class Person(): def say(self): pass class Student(Person): def say(self): print("i am student") 抽象类: 包含抽象方法的类 抽象类可以包含非抽象方法 抽象类可以有方法和属性 抽象类不能进行实例化 必须继承才能使用,且继承的子类必须实现所有抽象方法 import abc class Person(m

  • CI框架(CodeIgniter)公共模型类定义与用法示例

    本文实例讲述了CI框架(CodeIgniter)公共模型类定义与用法.分享给大家供大家参考,具体如下: 我们都知道,操作数据库的方法都写在模型中.但是一般情况下,一张表往往至少对应4个操作,也就是所谓crud.那么如果20张表,所对应的模型方法,就达到了80个,重复的操作显然这已经是一个体力活儿. 那么就对单表操作时,我们进行一下简单的封装.如下是ci框架的示例: <?php /** * Created by PhpStorm. * User: kangjianrong * Date: 16-8

随机推荐