当前位置: 首页 > 编程日记 > 正文

从零开始学Go之接口(一):接口

接口是双方约定的一种合作协议。接口实现者不需要关心接口会被怎样使用,调用者也不需要关心接口的实现细节。

接口是一种类型,也是一种抽象结构,不会暴露所含数据的格式、类型及结构。

声明:

接口类型是由一组方法签名定义的集合

type 接口类型名 interface{

方法名1( 参数列表1 ) 返回值列表1

方法名2( 参数列表2 ) 返回值列表2

}

type Goer interface {write() (int,error)Read() error
}

var 接口名 接口类型名

var goer Goer

接口本身包含两个数据(值,类型),只有当两者都是nil时才为接口值才为nil

实现:

接口类型的变量可以保存任何实现了这些方法的值。

要求:

接口的方法与实现接口的类型方法格式一致

接口中所有方法均被实现

type Goer interface {write() float64
}
​
func main() {var goer Goerv := Vertex{3, 4}f := MyFloat(-3.14)//goer=v //编译错误,没有v Vertex的对应方法goer = &vfmt.Println(goer.write())goer = ffmt.Println(goer.write())
}
​
type MyFloat float64
​
func (f MyFloat) write() float64 {if f < 0 {return float64(-f)}return float64(f)
}
​
type Vertex struct {X, Y float64
}
​
func (v *Vertex) write() float64 {return math.Sqrt(v.X*v.X + v.Y*v.Y)
}

运行结果:

5

3.14

类型和接口之间有一对多和多对一的关系,一个类型可以同时实现多个接口,而接口间彼此独立,不知道对方的实现,同时一个接口的方法,不一定需要由一个类型完全实现,接口的方法可以通过在类型中嵌入其他类型或者结构体来实现

空接口:

指定了零个方法的接口值被称为空接口

由于每个类型的方法都至少实现了0种,所以不用指定方法,可以用来保存任何类型的值或者处理未知类型的值

interface{}

var a interface{}

例子:

func main() {var i interface{}describe(i)
​i = 42describe(i)
​i = "hello"describe(i)
}
​
func describe(i interface{}) {fmt.Printf("(%v, %T)\n", i, i)
}

输出结果:

(<nil>, <nil>)

(42, int)

(hello, string)

函数接口:

除了结构体和类型能实现接口,函数类型也可以实现接口

// 调用器接口
type Invoker interface {// 需要实现一个Call方法Call(interface{})
}
​
// 函数定义为类型
type FuncCaller func(interface{})
​
// 实现Invoker的Call
func (f FuncCaller) Call(p interface{}) {// 调用f函数本体
 f(p)
}
​
func main() {// 声明接口变量var invoker Invoker// 将匿名函数转为FuncCaller类型,再赋值给接口invoker = FuncCaller(func(v interface{}) {fmt.Println("from function", v)})// 使用接口调用FuncCaller.Call,内部会调用函数本体invoker.Call("hello")
}

运行结果:

from function hello

转载于:https://www.cnblogs.com/VingB2by/p/11119835.html

相关文章:

【java】兴唐第二十四节课

HashMap中put函数的源码分析&#xff1a; &#xff08;一&#xff09;知识点&#xff1a; 1、方法resize&#xff08;&#xff09;的作用是扩容 2、 if ((p tab[i (n - 1) & hash]) null)其中n-1代表最后一个元素的下标&#xff0c;经过和hash的&后获取当前存储nod…

找不到可安装的ISAM”的问题

问题描述&#xff1a; 在 Access 或Sql Server中收到“Could not find installable ISAM”&#xff08;找不到可安装的 ISAM&#xff09;错误信息或者丢失某些文件类 解决方法&#xff1a; 1.注册表编辑器使用不当可能导致严重问题&#xff0c;可能需要重新安装操作系统。Micro…

修改mysql的时间/时区

# 背景 往db中insert数据发现时间不对&#xff0c;因为是新DB&#xff0c;所以猜测是mysql设置不对 # 解决方法 方法一&#xff1a;通过mysql命令行模式下动态修改 show variables like "%time_zone%"; 查看时区 --------------------------| Variable_name | Value…

【java】兴唐第二十五节课(异常和log4j的使用)

异常 1、try catch finally语法&#xff08;附带多重catch&#xff09; 代码实现&#xff1a; public static void main(String[] args) {try {int i 1/0;}catch(ArithmeticException e){System.out.println("出现数学运算异常&#xff1a;" e);}catch(ArrayIndex…

CentOS 命令提示符颜色及样式详解

命令提示符&#xff1a;prompt CentOS下查看当前命令提示符格式&#xff1a; 1 [rootlocalhost ~]# echo $PS1 #显示当前使用的PS1样式 2 [\u\h \W]\$ 命令提示符参数如下&#xff1a; \d &#xff1a;#代表日期&#xff0c;格式为weekday month date&#xff0c;例如&#…

Max_user_connections 与Max_connections 与max_connect_errors

对于连接数的设置&#xff0c;show variables里有三个参数可以对它进行控制&#xff0c;max_connections与max_user_connections以及max_connect_errors。下面对这三个参数相关描述。 max_connections&#xff1a;针对所有的账号所有的客户端并行连接到MYSQL服务的最大并行连接…

压力变动力,存储追求高效率

企业的数据存储量每年都要大幅增长&#xff0c;但是IT预算呈现紧缩趋势。这就是企业面临的最大存储难题&#xff0c;即如何平衡数据增长与提高存储利用率和降低成本之间的关系。 非结构化数据带来的难题 存储最直接的压力来自于不断增长的数据量。今天&#xff0c;我们面对的是…

Hadoop学习之路(三)Hadoop-2.7.5在CentOS-6.7上的编译

下载Hadoop源码 1、登录官网 2、确定你要安装的软件的版本 一个选取原则&#xff1a; 不新不旧的稳定版本 几个标准&#xff1a; 1&#xff09;一般来说&#xff0c;刚刚发布的大版本都是有很多问题 2&#xff09;应该选择某个大版本中的最后一个小版本 阅读编译文档 1、准备一…

static String valueOf(XXX xxx)

1 package day01;2 /**3 * static String valueOf(XXX xxx)4 * 字符串提供了一组静态的重载的valueOf方法,作用5 * 是将其他类型转换为字符串6 * author ta7 *8 */9 public class Demo10 { 10 public static void main(String[] args) { 11 int a 123; 12 …

【java】兴唐第二十五节课小程序学生卡转账小系统(自己写的异常)

1、StuCard.java public class StuCard {public static void TransMoney(int source, int money, int target) {money - target;if(money < 0) {throw new NotEnoughMoneyException("余额不足");}System.out.println("商家的余额为&#xff1a;" sour…

【JQUBAR1.1】jQuery 插件发布

【JQUBAR1.1】jQuery 插件发布 JQUBAR1.1 简介 2010-11-22在博客园发布了柱状图JQUBar1.0 jQuery 插件。现将该插件升级为1.1版本。 1.1版本修复了部分bug&#xff0c;同时新增以下功能&#xff1a; 1.可自定义坐标颜色 2.可自定义X,Y轴坐标名称 3.Y轴动态坐标自动建立 4.Y…

ssh远程操作服务器

登录方式 ssh account192.168.xxx.xxx 输入密码 远程上传下载文件 上传&#xff1a; scp filepath acount192.168.xxx.xxx:path filepath为要上传的文件路径path为上传到服务器的储存路径 下载&#xff1a; scp acount192.168.xxx.xxx:filepath path filepath为要下载的文件路径…

【java】兴唐第二十三节课作业

已知如下&#xff1a; 下表为某班级四次考试成绩单&#xff0c; 要求使用HashMap<String, Integer>存储每次考试的成绩&#xff08;key键为姓名&#xff0c;value为成绩&#xff09;。要求使用LinkedList存储考试次数&#xff0c;有几次考试就有几个HashMap注意&#xf…

Data - 数据思维 - 中篇

6 - 模型与框架 利用现有的成熟的理论、模型与框架&#xff0c;结合实际业务情况&#xff0c;搭建分析框架&#xff0c;尽量确保数据分析维度的完整性&#xff0c;结果的有效性及正确性。 营销理论模型&#xff1a;4P、用户使用行为、STP理论、SWOT等。管理理论模型&#xff1a…

快速设置戴尔latitude笔记本的触摸板和指点杆

// TouchPadSettings.cpp : Defines the entry point for the console application.// by windviki 2010/08/31// 转载请注明出处。//// 办公用的戴尔笔记本除了触摸板&#xff0c;还在键盘中间有一个指点杆&#xff08;point stick&#xff09;// 打字很不习惯&#xff0c;经常…

Ubuntu 10.10系统安装手记

原来一直在公司用Ubuntu&#xff0c;感觉做开发是相当不错的&#xff0c;特别那种各种利用命令的方式真是太高效了。所以现在想把笔记本也装上&#xff0c;弄了半天&#xff0c;也遇到不少问题&#xff0c;记下来备忘一下。 虚拟机还是双系统 磁盘里面好多东西&#xff0c;基本…

php值传参,引用传参以及对象传参

传值&#xff1a;是把实参的值赋值给行参 &#xff0c;那么对行参的修改&#xff0c;不会影响实参的值传引用 &#xff1a;真正的以地址的方式传递参数传递以后&#xff0c;行参和实参都是同一个对象&#xff0c;只是他们名字不同而已对行参的修改将影响实参的值说明&#xff1…

用一行代码高效的求一个列表的平方和

最近看到一个笔试题&#xff0c;考察的都是 Python 中的高阶函数 题目如下&#xff1a;用一行代码高效的求一个列表的平方和(不能用 sum 函数) 分析 1.先将列表中每个值作平方&#xff1a; 立即想到 map 函数&#xff0c;假设列表是 range(10)&#xff0c;那么这个列表中平方是…

【java】第二十二节课(HashSet)

1、使用HashSet建立对象、添加元素并使用两种方法遍历 代码实现 public class SetDemo {public static void main(String[] args) {Set<String> set new HashSet();set.add("猴子");set.add("八戒");set.add("唐僧");set.add("沙僧…

转:在 .NET 中实现异步回调访问数据库

在 .NET 中实现异步回调访问数据库 时间:2009-11-17 19:52来源:网络收集 作者:佚名 点击: 334 次 技术论坛某些场合下&#xff0c;在对数据库进行访问时&#xff0c;为了避免同步访问数据时所带来的延迟&#xff0c;我们需要改进设计&#xff0c;以提高程序执行效率。一方面&am…

《资安人》:迈向成功SOC之路

近日&#xff0c;台湾的《资安人》上发表了一篇文章——《迈向成功的SOC之路》&#xff0c;现转载至此&#xff0c;以飨读者。【作者&#xff1a;王榮信 -11/08/2010】在現代虛擬世界中&#xff0c;造成資訊安全事件的來源為病毒、蠕蟲或木馬&#xff0c;不變的安全事件來源就是…

Laravel 上使用 phpexcel的两种方式

原创 2017年06月24日 20:24:311229文章采集与网上 方式1。使用原生的phpexcel &#xff0c; http://blog.csdn.net/CSwfe/article/details/52748046?locationNum1 1、在app目录下创建一个新的文件夹&#xff0c;命名libs&#xff08;可自定义&#xff09; app/libs/phpExcel2…

剑指offer-----Python-----栈

用两个栈实现队列 题目&#xff1a;用两个栈来实现一个队列&#xff0c;完成队列的Push和Pop操作。队列中元素为int类型. 首先&#xff0c;栈都是先进后出&#xff0c;但是队列呢&#xff0c;一般是先进先出。也就是创建两个栈stack1和stack2&#xff0c;使用两个“先进后出”的…

【工具软件】markdown编译器待办事项无法打勾

使用时可以直接点击上方工具栏的 List item 注意&#xff1a;此时已经自动在里面加了一个空格&#xff0c;如果直接加x的话&#xff0c;不会打勾&#xff0c;如下&#xff1a;[ x] List item 所以先删除空格在加x 问题解决

【转】创建不可见的Activity

在android开发中有时候会用到一些后台的Activity&#xff0c;但又不适合使用service&#xff0c;比如直接点击程序图标时只是执行一段代码&#xff0c;不需要弹出程序界面。此时可以在项目的AndroidManifest.xml文件中相应的Activity标签中添加这样一行&#xff1a;android:the…

关于 TApplication 详解 三 ---- TComponent

ComponentCount属性 对应对象&#xff1a;所有组件 声明&#xff1a;property ComponentCount: Integer; 功能&#xff1a;此属性在运行时有效&#xff0c;它是只读型。同时它标明组件具有的组件数。当用户在设计时可以在窗体上放置一个组件&#xff0c;因此此窗体将变为…

[转载] K3 K3c 最简单无损开壳方法

只用一把螺丝刀就行了&#xff0c;其它什么撬棒 信用卡 撬片等 拆机工具一概不用。拆了5台&#xff0c;只有一台断了一个扣口。1. 把底部4个螺丝拿掉。2.把路由如图放在桌子上&#xff0c;路由平行于身体&#xff0c;注意是立着放 使路由与桌子接触的部分成30度角。这样使一侧…

图像处理随笔知识

采样频率&#xff1a; 采样频率是指1s内采样的次数&#xff0c;反映了采样点之间的间隔大小。 采样频率越高&#xff0c;得到的图像样本越逼真&#xff0c;图像质量越高&#xff0c;但要求的存储量也越大。 图像量化&#xff1a; 要用多大范围的数值来表示图样采样之后的每一个…

一则android软件开发工程师的招聘信息

岗位职责&#xff1a; 从事Android平台的客户端软件开发 任职资格&#xff1a; 1、一年以上Android平台开发经验&#xff1b; 2、两年以上Java开发经验&#xff1b; 3、熟悉Android开发架构和API调用&#xff1b; 4、熟悉HTTP、TCP/IP通讯协议&#xff1b; 5、熟悉面向对象编程…

【数据库】数据库基本操作

操作练习&#xff1a; 创建数据库 删除数据库 修改数据库配置 创建数据表 修改表结构 ———————————— 添加字段 修改字段 重命名字段 更改主键 删除字段 ———————————— 重命名表名 删除表 截断表 表数据的操作 添加数据 修改数据 删除数…