39-Golang中的接口

news2024/12/19 7:05:36

Golang中的接口

    • 基本介绍
    • 基本语法
    • 注意事项和细节
    • 案例
      • 实现对Hero结构体切片的排序:sort.Sort(data Interface)
    • 实现接口和继承之间的比较
      • 区别

基本介绍

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

基本语法

在这里插入图片描述
说明:

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

2.Golang中的接口,不需要显式的实现。只要一个变量,含有接口类型中的所有方法,那么这个变量就实现这个接口。因此,Golang中没有implement这样的关键字。

注意事项和细节

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

在这里插入图片描述

  • 2.接口中所有的方法都没有方法体,即都是没有实现的方法
  • 3.在golang中,一个自定义类型需要将某个接口与的所有方法都实现,则这个自定义类型实现了该接口
  • 4.一个自定义类型只有实现了某个接口,才能将该自定义类型的实例(变量)赋给接口类型
  • 5.只要是自定义数据类型,就可以实现接口,不仅仅是结构体类型

在这里插入图片描述

  • 6.golang接口中不能有任何变量

在这里插入图片描述

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

在这里插入图片描述
在这里插入图片描述

  • 8.一个接口(比如A接口)可以继承多个别的接口(比如B,C接口),这时如果 要实现A接口,也必须将B,C接口分方法也全部实现
package main
import (
	_ "fmt"
)
type BInterface interface {
	test01
}

type CInterface interface {
	test02
}

type AInterface interface {
	BInterface
	CInterface
	test03
}

//如果要事项AInterface,就需要将Binterface,CInterface的方法都实现

type Stu struct {

}
func (stu Stu) test01() {
	
}
func (stu Stu) test02() {

}
func (stu Stu) test03() {

}

func main() {
	var str Stu
	var a AInterface = stu
	a.test01
}
  • 9.interface类型默认是一个指针(引用类型),如果没有对interface初始化就使用,那么会输出nil
  • 10.空接口interface{}没有任何方法,所以所有类型都实现了空接口,即我们可以把任何一个变量赋给空接口
type T interface{

}
func main() {
	var t T = stu //ok
	fmt.Println(t)
    var t2 interface{} = stu
    var num1 float64 = 8.8
    t2 = num1
    t = num1
    fmt.Println(t2, t)
}

案例

在这里插入图片描述

实现对Hero结构体切片的排序:sort.Sort(data Interface)

package main
import (
	"fmt"
	"sort"
	"math/rand"
)

//1.声明一个hero结构体
type Hero struct {
	Name string
	Age int
}
//2.声明一个Hero结构体切片类型
type HeroSlice []Hero

//3.实现Interface接口,//文档固定的
func (hs HeroSlice) Len() int {
	return len(hs)
}

//less这个方法就是决定是使用什么标准进行排序
//1.按年龄从小到大

func (hs HeroSlice) Less(i, j int) bool {
	return hs[i].Age < hs[j].Age
}

func (hs HeroSlice) Swap(i, j int) {
	temp := hs[i]
	hs[i] = hs[j]
	hs[j] = temp
}

func main() {
	//先定义一个数组/切片
	var intslice = []int{0 , -1, 10, 7, 90}
	//要求对intslice进行排序
	sort.Ints(intslice)
	fmt.Println(intslice)

	//对一个结构体切片进行排序
	var heroes HeroSlice
	for i := 0; i < 10; i++{
		hero := Hero{
			Name :fmt.Sprintf("英雄~%d", rand.Intn(100)),
			Age : rand.Intn(100),
		}
		//将hero append到heroes切片
		heroes = append(heroes, hero)
	}
	//看看排序前的顺序
	for _ , v := range heroes {
		fmt.Println(v)
	}

	//调用sor.tSort
	sort.Sort(heroes)
	fmt.Println("-----------------")
	//看看排序后的顺序
	for _ , v := range heroes {
		fmt.Println(v)
	}

}
/*
[-1 0 7 10 90]
{英雄~81 87}
{英雄~47 59}
{英雄~81 18}
{英雄~25 40}
{英雄~56 0}
{英雄~94 11}
{英雄~62 89}
{英雄~28 74}
{英雄~11 45}
{英雄~37 6}
-----------------
{英雄~56 0}
{英雄~37 6}
{英雄~94 11}
{英雄~81 18}
{英雄~25 40}
{英雄~11 45}
{英雄~47 59}
{英雄~28 74}
{英雄~81 87}
{英雄~62 89}
*/

实现接口和继承之间的比较

1.接口是继承的补充

2.当a结构体继承了b结构体,那么a结构体就自动继承了b结构体的字段和方法,并且可以直接使用

3.当a结构体需要扩展功能,同时不希望去破坏继承关系,则可以去实现某个接口即可

package main 
import (
	"fmt"
)

//monkey结构体
type Monkey struct {
	Name string
}

//声明接口
type BirdAble interface {
	Flying()
}

func (this *Monkey) climbing() {
	fmt.Println(this.Name, "天生会爬树")
}

//littleMonkey结构体
type LittleMonkey struct {
	Monkey //继承
}

//让littlemonkey实现birdable
func (this *LittleMonkey) Flying() {
	fmt.Println(this.Name, "通过学习学会飞")
}

func main() {
	//差UN交啊ing一个littlemonkey 实例
	monkey := LittleMonkey{
		Monkey {
			Name : "悟空",
		},
	}
	monkey.climbing()
	monkey.Flying()
}
//悟空 天生会爬树
//悟空 通过学习学会飞

区别

  • 接口和继承解决的问题不同
    • 继承的价值主要在于:解决代码的复用性和可维护性
    • 接口的价值主要在于:设计好各种规范(方法),让其它自定义类型去实现这些方法
  • 接口比继承更加灵活
    • 继承是满足is - a的关系,而接口只需要满足like - a的关系
  • 接口在一定程度上实现代码解耦

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

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

相关文章

【编程入门】应用市场(NodeJS版)

背景 前面已输出多个系列&#xff1a; 《十余种编程语言做个计算器》 《十余种编程语言写2048小游戏》 《17种编程语言10种排序算法》 《十余种编程语言写博客系统》 《十余种编程语言写云笔记》 《N种编程语言做个记事本》 目标 为编程初学者打造入门学习项目&#xff0c;使…

JUC-Synchronized相关内容

设计同步器的意义多线程编程中&#xff0c;有可能会出现多个线程同时访问同一个共享、可变资源的情况&#xff0c;这个资源我们称之其为临界资源&#xff1b;这种资源可能是&#xff1a;对象、变量、文件等。共享&#xff1a;资源可以由多个线程同时访问可变&#xff1a;资源可…

25 openEuler管理网络-使用nmcli命令配置ip

文章目录25 openEuler管理网络-使用nmcli命令配置ip25.1 nmcli介绍25.2 设备管理25.2.1 连接到设备25.2.2 断开设备连接25.3 设置网络连接25.3.1 配置动态IP连接25.3.1.1 配置IP25.3.1.2 激活连接并检查状态25.3.2 配置静态IP连接25.3.2.1 配置IP25.3.2.2 激活连接并检查状态25…

Mr. Cappuccino的第44杯咖啡——Kubernetes之Service

Kubernetes之ServiceService的概念Service的类型Service演示案例环境准备ClusterIP&#xff08;集群内部访问&#xff09;IptablesIPVSEndpointNodePort&#xff08;对外暴露应用&#xff09;LoadBalancer&#xff08;对外暴露应用&#xff0c;适用于公有云&#xff09;Ingress…

3.抽象工厂模式

与工厂模式对比 工厂模式 工厂模式是类创建模式。在工厂模式中&#xff0c;只需要生产同一种产品&#xff0c;只不过是生产厂家不同。 所以产品类的设计&#xff1a; 抽象的产品类Product具体的产品类Product_A&#xff0c;Product_B, Product_C, Product_D…… 工厂的设计…

详解Android 13种 Drawable的使用方法

前言关于自定义View&#xff0c;相信大家都已经很熟悉了。今天&#xff0c;我想分享一下关于自定义View中的一部分&#xff0c;就是自定义Drawable。Drawable 是可绘制对象的一个抽象类&#xff0c;相对比View来说&#xff0c;它更加的纯粹&#xff0c;只用来处理绘制的相关工作…

用Python+ChatGPT批量生成论文概述

用PythonChatGPT批量生成论文概述 做算法研究离不开阅读大量论文。从海量论文中找到需要的论文往往耗费算法团队不少的精力。 ChatGPT官方例子中有一个“TL;DR”摘要生成&#xff0c;非常适合生成论文摘要。 于是我用pythonGPT-3 API开发了一个工具&#xff0c;可以直接从arx…

基于Android校园失物招领的设计与实现

需求信息&#xff1a; 客户端&#xff1a; 1&#xff1a;登录注册&#xff1a;用户可以通过自己的信息进行账号的注册 2&#xff1a;查看信息&#xff1a;用户可以查看失物和拾物信息&#xff0c;以及对信息进行点赞和评论 3&#xff1a;发布拾物信息&#xff1a;用户可以发布自…

连阿迪达斯都卖不动了!是国潮太卷,还是消费者对品牌祛魅了?

据权威报告&#xff0c;2022年&#xff0c;阿迪达斯业绩不佳&#xff0c;尤其是大中华区表现疲软。就在昨晚&#xff0c;阿迪在业绩指引中称“2023年营运亏损可能高达7亿欧元”&#xff0c;其美国存凭证&#xff08;ADR&#xff09;价格暴跌近9%。值得注意的是&#xff0c;这已…

2分钟告诉你怎么成为一名黑客?零基础入门

在很久很久以前&#xff08;别问我有多久&#xff0c;不要在意这些细节&#xff09;&#xff0c;“ 黑客”指的是 喜爱钻研技术、精通计算机技术的程序员。后来有些黑客写了些能破坏程序或者系统正常运行的代码&#xff0c;又用搞了些破坏&#xff0c;于是这些黑客有了新的称呼…

APP优化 —— MMAP内存映射

mmap 一种内存映射文件的方法 mmap将一个文件或者其它对象映射进内存。文件被映射到多个页上&#xff0c;如果文件的大小不是所有页的大小之和&#xff0c;最后一个页不被使用的空间将会清零。mmap在用户空间映射调用系统中作用很大。 头文件 <sys/mman.h> 函数原型 v…

微信小程序(起步)

微信小程序1、微信小程序--起步1.1 小程序简介1.2 小程序构成1.3 小程序的宿主环境1.4 协同工作和发布1、微信小程序–起步 1.1 小程序简介 小程序与普通网页开发的区别 运行环境不同 网页运行在浏览器中&#xff0c;小程序运行在微信环境中 API不同 小程序无法调用DOM和BOM…

【unity3d】1 界面 贴图 渲染 相机

一 学习背景 暴雪国服停运后&#xff0c;没有星际玩要死力 玩了一段时间[原神]感觉这个世界观和机制设定有点牛笔&#xff0c;米哈游怎么不像[魔兽世界-魔兽争霸]的关系那样&#xff0c;做个[原神争霸]捏&#xff0c;不如自己做一个耍耍 二 unity3d安装 1 官网&#xff0c;直…

Kotlin DSL 实战

1. 前言Kotlin 是一门对 DSL 友好的语言&#xff0c;它的许多语法特性有助于 DSL 的打造&#xff0c;提升特定场景下代码的可读性和安全性。本文将带你了解 Kotlin DSL 的一般实现步骤&#xff0c;以及如何通过 DslMarker &#xff0c; Context Receivers 等特性提升 DSL 的易用…

GORM-GEN快速上手

目录 1.什么是 GEN 2.GEN特性 3.快速使用GEN 3.1. 下载 3.2. 生成 4. 基础查询 5. 自定义 SQL 查询 6.demo源码 1.什么是 GEN 官方文档&#xff1a;Gen Guides | GORM - The fantastic ORM library for Golang, aims to be developer friendly. GEN 项目地址&#xf…

「mysql是怎样运行的」第19章 从猫爷被杀说起---事务简介

「mysql是怎样运行的」第19章 从猫爷被杀说起—事务简介 文章目录「mysql是怎样运行的」第19章 从猫爷被杀说起---事务简介[toc]一、事务的起源概述原子性(Atomicity)隔离性(Isolation)一致性(Consistency)持久性(Durability)二、事务的概念一、事务的起源 概述 对于大部分程…

android UI优化的基本原理和实战方法

任何Android应用都需要UI跟用户交互.UI是否好坏更是直接影响到用户的体验.如今UI的优化视乎是应用开发中一个绕不过去的话题。所以本篇文章小编带大家全面了解Android ui优化的主要知识和优化方法。 一、UI优化 UI优化知识点主要分为三部分&#xff1a; 第一部分&#xff0c…

Linux简单介绍(基本涵盖日常使用到的各种shell知识点)

文章目录shell基础认知1. shell语言2. 脚本执行方式3. 快捷键4. 通配符5. 命令后跟的选项6. 逻辑运算 && ||7. 算术运算&#xff08;equal&#xff0c;great&#xff0c;less&#xff09;8. 目录或文件意义9. 规则10. vimshell脚本常规内容解释1. set -ex2. set -o pip…

Google Brain新提出的优化器“Lion”,效果要比Adam(W)更好

Google Brain新提出的优化器“Lion”&#xff0c;效果要比Adam(W)更好 论文地址&#xff1a;https://arxiv.org/abs/2302.06675代码地址&#xff1a;https://github.com/google/automl/blob/master/lion/lion_pytorch.py 1 简单、内存高效、运行速度更快 与 AdamW 和各种自适…

量子计算对网络安全的影响

量子计算的快速发展&#xff0c;例如 IBM 的 Quantum Condor 处理器具有 1000 个量子比特的容量&#xff0c;促使专家们宣称第四次工业革命即将实现“量子飞跃”。 量子计算机的指数处理能力已经受到政府和企业的欢迎。 由于从学术和物理原理到商业可用解决方案的不断转变&am…