Golang 接口笔记

news2024/9/29 18:14:22

基本介绍

接口是一个数据类型,可以定义一组方法,但都不需要实现。并且interface中不能包含任何变量。到某个自定义类型要使用的时候,再根据具体情况把这些方法实现出来

语法

type 接口名 interface {

method1(参数列表) 返回值列表

method2(参数列表) 返回值列表

}

说明:

  • 接口申明中所有的方法,都没有方法体,即接口中的方法都是没有实现的方法。接口体现了程序设计的多态和高内聚低耦合的思想

  • golang中的接口不需要显式的实现,只要一个变量含有接口类型中的所有方法,那么这个变量就实现了这个接口

入门示例

package main

import "fmt"

// 声明一个Usb接口
type Usb interface {
    Start()
    Stop()
}

// 定义一个手机结构体
type Phone struct {
}

// 手机结构体实现接口方法
func (p Phone) Start() {
    fmt.Println("手机开始工作...")
}
func (p Phone) Stop() {
    fmt.Println("手机停止工作...")
}

// 定义一个相机结构体
type Camera struct {
}

// 相机结构体实现接口方法
func (c Camera) Start() {
    fmt.Println("相机开始工作...")
}
func (c Camera) Stop() {
    fmt.Println("相机停止工作...")
}

// 定义一个电脑结构体
type Computer struct{}

// 电脑结构体绑定方法,接受Usb接口参数
func (c Computer) Working(usb Usb) {
    usb.Start()
    usb.Stop()
}

func main() {
    phone := Phone{}
    camera := Camera{}
    computer := Computer{}
    computer.Working(phone)
    computer.Working(camera)
}

接口细节

  • 接口本身不能创建实例,但是可以指向一个实现了该接口的自定义类型的变量

  • 接口中所有的方法都没有方法体

  • 在Golang中,一个自定义类型要实现某个接口,该自定义类型需要将接口的所有方法都实现

  • 一个自定义类型只有实现了某个接口,才能将该自定义类型的实例(变量)赋给给接口。案例详见1

  • 只要是自定义类型就可以实现接口,不仅仅是结构体类型

  • 一个自定义类型可以实现多个接口

package main

import "fmt"

// 定义接口AInterface
type AInterface interface {
    Hello()
}

// 定义解决BInterface
type BInterface interface {
    World()
}

// 定义结构体类型,同时实现接口AInterface、BInterface
type AStruct struct {
}

// 实现接口AInterface
func (a AStruct) Hello() {
    fmt.Println("Hello")
}

// 实现接口BInterface
func (a AStruct) World() {
    fmt.Println("World")
}

func main() {
    // a同时实现了接口AInterface、BInterface
    a := AStruct{}
    a.Hello()
    a.World()

    var ainterface AInterface
    ainterface = a
    ainterface.Hello() // AInterface只能调用自己定义的方法

    var binterface BInterface
    binterface = a
    binterface.World() // BInterface只能调自己定义的方法
}
  • 接口定义中不能有任何变量

  • 一个接口(比如A接口)可继承多个别的接口(比如B,C接口),这时要实现A接口,也必须将B,C接口的方法全部实现

package main

import "fmt"

type B interface {
    b()
}

type C interface {
    c()
}

// A接口继承了B,C接口
type A interface {
    B
    C
    a() // A接口自定义方法
}

type Stu struct{}

func (stu Stu) a() {
    fmt.Println("a")
}
func (stu Stu) b() {
    fmt.Println("b")
}
func (stu Stu) c() {
    fmt.Println("c")
}
func main() {
    stu := Stu{}
    stu.a()
    stu.b()
    stu.c()
    fmt.Println("-----------")
    var a A
    a = stu
    a.a()
    a.b()
    a.c()
}
  • interface类型默认是一个指针(引用类型),如果没有对interface初始化就使用,会输出nil

  • 空接口interface{}没有任何方法,所以所有类型都实现了空接口,即我们可以把任何一个变量赋给空接口

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/370550.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

UG NX二次开发(C#)-CAM-点击插件自动进入CAM模块

文章目录 1、前言2、调用CAM模块错误2、进入加工模块1、前言 UG NX软件中CAM模块作为一个很重要的,也是其特别亮点的功能模块,能实现车、铣、磨、钻等加工工艺编程,但是由于其是通用性比较强,对于专业上的可能不能完全满足要求,这就要求我们在CAM模块下进行二次开发。我们…

操作系统核心知识点整理--进程篇

操作系统核心知识点整理--进程篇什么是系统调用进程篇什么是进程什么是线程从一次fork调用看linux进程和线程的本质区别小结用户级线程和内核级线程的区别进程的状态进程的切换进程调度并发问题死锁参考本文主要面向应用层软件开发人员整理一篇必须了解的操作系统核心知识图谱&…

maya多边形顶点变形批量传递方法

一、问题描述 做项目时,对于重复更改相同模型的顶点位置需要大量重复操作,maya默认提供了多边形属性传递的方法,如下图: 但一次只能执行一次,并且带有大量历史节点,此方式的好处是,可以实现实…

《零成本实现Web自动化测试--基于Selenium》 Selenium-RC

一. 简介 Selenium-RC可以适应更复杂的自动化测试需求,而不仅仅是简单的浏览器操作和线性执行。Selenium-RC能够充分利用编程语言来构建更复杂的自动化测试案例,例如读写文件、查询数据库和E-mail邮寄测试报告。 当测试案例遇到selenium-IDE不支持的逻辑…

python的所有知识点+代码+注释,不看就亏死了

目录 简介 特点 搭建开发环境 版本 hello world 注释 文件类型 变量 常量 数据类型 运算符和表达式 控制语句 数组相关 函数相关 字符串相关 文件处理 对象和类,注:不是那个对象!!!!&…

HTML创意动画代码

目录1、动态气泡背景2、创意文字3、旋转立方体1、动态气泡背景 <!DOCTYPE html> <html> <head><title>Bubble Background</title><style>body {margin: 0;padding: 0;height: 100vh;background: #222;display: flex;flex-direction: colum…

SpringCloud————Eureka概述及单机注册中心搭建

Spring Cloud Eureka是Netflix开发的注册发现组件&#xff0c;本身是一个基于REST的服务。提供注册与发现&#xff0c;同时还提供了负载均衡、故障转移等能力。 Eureka组件的三个角色 服务中心服务提供者服务消费者 Eureka Server&#xff1a;服务器端。提供服务的注册和发现…

kubernetes 1.26.1 Etcd部署(外接)保姆级教程

目录 部署etcd前期准备 机器信息 升级内核 系统配置 部署容器运行时Containerd 安装crictl客户端命令 配置服务器支持开启ipvs的前提条件 安装 kubeadm、kubelet 和 kubectl 安装部署etcd 1.将 kubelet 配置为 etcd 的服务管理器 2.为 kubeadm 创建配置文件 3. 生成…

2023年网络安全某市赛竞赛任务书

竞赛任务书 一、竞赛时间 共计3小时。 二、竞赛阶段 竞赛阶段 任务阶段 竞赛任务 竞赛时间 分值 第一阶段单兵模式系统渗透测试 任务一 数据库服务渗透测试 100分钟 150 任务二 Windows操作系统渗透测试 200 任务三 Linux操作系统渗透测试 150 任务四 Web安…

【人工智能 AI】什么是人工智能? What is Artificial Intelligence

目录 Introduction to Artificial Intelligence人工智能概论 What is Artificial Intelligence? 什么是人工智能?

ProtoBuf介绍

1 编码和解码编写网络应用程序时&#xff0c;因为数据在网络传输的都是二进制字节码数据&#xff0c;在发送数据时进行编码&#xff0c;在接受数据时进行解码codec&#xff08;编码器&#xff09;的组成部分有2个&#xff1a;decoder&#xff08;解码器&#xff09;和encoder&a…

回归预测 | MATLAB实现BO-CNN-BiLSTM贝叶斯优化卷积双向长短期记忆网络数据回归预测

回归预测 | MATLAB实现BO-CNN-BiLSTM贝叶斯优化卷积双向长短期记忆网络数据回归预测 目录回归预测 | MATLAB实现BO-CNN-BiLSTM贝叶斯优化卷积双向长短期记忆网络数据回归预测效果一览基本介绍模型搭建程序设计参考资料效果一览 基本介绍 基于贝叶斯优化卷积双向长短期记忆网络(…

自动化测试整理 --- STAF/STAX Robot Framework

题记:上周花了点时间学习开源的自动化测试框架Robot Framework,结合自己之前的自动化经验&#xff0c;就想周末写篇文章整理下。 目前&#xff0c;所在项目的自动化测试框架是基于STAF/STAX的拓展&#xff0c;围绕STAX执行引擎&#xff0c;扩展了测试用例的创建、管理&#xf…

验证功能覆盖率收集时per_instance=1可能导致覆盖率线性增长

验证覆盖率收集时&#xff0c;发现coverage database达到了惊人的256G&#xff0c;如下&#xff1a; 进入database中的testdata目录下的用例定位发现&#xff0c;问题出在这个文件&#xff1a; testbench.inst.xml其大小基本等同于验证用例覆盖率的大小。 这个文件时怎么产…

C++函数新思想和标准的输入和输出

欢迎来观看温柔了岁月.c的博客目前设有C学习专栏C语言项目专栏数据结构与算法专栏目前主要更新C学习专栏&#xff0c;C语言项目专栏不定时更新待C专栏完毕&#xff0c;会陆续更新C项目专栏和数据结构与算法专栏一周主要三更&#xff0c;星期三&#xff0c;星期五&#xff0c;星…

【决策树】一文看懂图解决策树原理:信息熵、条件熵与信息增益

本文用过图解的方式并结合实际案例的方式讲述了决策树的基本原理&#xff0c;主要包含信息熵、条件熵与信息增益的概念与计算方式&#xff0c;以及如何选择各个决策节点&#xff08;即&#xff1a;选择信息增益最大的特征&#xff09;。 想要PDF文档的小伙伴&#xff0c;通过关…

[SCOI2005]骑士精神(C++,启发式搜索)

题目描述 输入格式 第一行有一个正整数 TTT&#xff08;T≤10T \le 10T≤10)&#xff0c;表示一共有 TTT 组数据。 接下来有 TTT 个 555 \times 555 的矩阵&#xff0c;0 表示白色骑士&#xff0c;1 表示黑色骑士&#xff0c;* 表示空位。两组数据之间没有空行。 输出格式 …

【Node.js】详细记录express路由和中间件

Node.js路由的概念什么是路由Express中的路由路由的匹配过程路由的使用创建路由模块文件注册路由模块文件为路由模块添加前缀Express中间件Express中间件格式定义中间件函数定义全局生效的中间件函数中间件的作用定义多个全局中间件局部生效的中间件定义多个局部生效的中间件了…

Ae:使用代理

如果希望加快合成的预览或渲染速度&#xff0c;可考虑对素材使用代理 Proxy。虽然在 Ae 中&#xff0c;可以指定任何的静止图像或视频为代理&#xff0c;但一般情况下还是建议创建源素材的低分辨率版本来作为代理。对素材创建或指定代理后&#xff0c;可随意切换是否使用代理来…

物联网在医疗保健领域的5大创新应用

如今&#xff0c;物联网的发展越来越迅速&#xff0c;我们无法低估物联网在当今世界的重要性。大多数人每天都会使用到物联网设备。例如&#xff0c;当你使用智能手表来跟踪你的锻炼时&#xff0c;你就间接地使用了物联网的功能。由于物联网为世界带来了很多有效的帮助&#xf…