Go_接口、多态、接口继承、空接口、类型断言

2023-11-20

接口

  • 接口是把所有具有共性的方法定义在一起,是方法集,任何类型实现了接口中所有的方法,就是实现了这个接口。
  • 接口可以实现多态
  • 接口传递的是地址值

接口定义及调用:

定义格式:

tepe 接口名 interface{
  方法名(参数) 返回值
}

调用格式1:

对象名.方法名

调用格式2:通过接口变量调用必须实现接口所有方法

var 变量名 接口名

结构体和结构体指针实现接口

type TestInterface interface {
	Hello()
}
func (s Student) Hello() {}  // 使用结构体实现接口
func (s *Student) Hello() {} // 使用结构体指针实现接口

只要结构体和接口中的方法名一样,就会认为这么结构体实现了这个接口的方法

type Student struct{}

type Teacher struct{}

type TestInterface interface {
	//age int // 接口中不能有变量
	//Welcome()
	Hello()
}

type TestInterface2 interface {
	Hello2()
}

// 一个结构体可以实现多个接口
func (s *Student) Hello() {
	fmt.Println("Student实现了Hello方法")
}

func (s *Student) Hello2() {
	fmt.Println("Student实现了Hello2方法")
}

// 一个接口可以被多个结构体实现
func (t *Teacher) Hello() {
	fmt.Println("Teacher实现了Hello方法")
}

func main() {
	// 对象名.方法名
	var stu Student
	stu.Hello()
	var tea Teacher
	tea.Hello()

	// 通过接口变量调用,如果接口中有两个方法,但是只实现了一个,就会报错,必须全部实现
	var t TestInterface
	t = &stu
	t.Hello()
}

接口继承:

接口的继承和普通继承是一样的,直接写接口名就可以了,但是要实现继承接口的所有方法

func main() {
	var stu Student
	var t TestInterface02
	// 接口中的方法数据类型是指针类型就要使用取地址符,如果方法的类型不是指针就不用加
	t = &stu
	t.Hello() // 可以调用所继承接口中的方法
	t.HelloHello()

	var test TestInterface
	test = t
	test.Hello()
}

type Student struct{}

type TestInterface interface {
	Hello()
}

type TestInterface02 interface {
	TestInterface // 继承接口
	HelloHello()
}

func (student *Student) Hello() {
	fmt.Println("Hello")
}

func (student *Student) HelloHello() {
	fmt.Println("HelloHello")
}

空接口:

空接口不包含任何的方法,所有的类型都实现了空接口,因此空接口可以存储任意类型的数值

func main() {
	// 定义空接口的切片,由于是空接口所以可以存储任意类型的数据
	var s []interface{}
	s = append(s, 1, 2, 3, "字符串", 1.1, true)
	fmt.Println(s)

	// map也可以使用接口
	m := make(map[string]interface{})
	m["打野"] = "韩信"
	m["金币"] = 50
	fmt.Println(m)
}

多态:

  • 多态是同一个接口,使用不同的实例执行不同的操作
  • 多态是除封装、继承之后面向对象的第三大特征。
  • 多态是出现在接口关系中的(只能是接口)

例:汽车和摩托车都属于车,但具有不同的功能

多态的实现:

func 函数名 (参数 接口类型){}

演示:

func main() {
	var stu Student
	var tea Teacher

	// 多态,要加取地址符,因为方法是指针类型
	Polymorphic(&stu) //Student类实现了接口的Hello方法
	Polymorphic(&tea) // Teacher类实现了接口的Hello方法
}

type Student struct{}

type Teacher struct{}

type TestInterface interface {
	Hello()
}

func (student *Student) Hello() {
	fmt.Println("Student类实现了接口的Hello方法")
}

func (teacher *Teacher) Hello() {
	fmt.Println("Teacher类实现了接口的Hello方法")
}

func Polymorphic(p TestInterface) {
	p.Hello()
}

类型断言:

通过类型断言,可以判断空接口中存储的数据类型

定义格式:

value,ok:=m.(T)
  • value:表示变量m的值
  • ok:表示布尔类型变量,如果断言成功为true,否则为false
  • m:表示空接口类型的变量,如果推断成功就把数据赋值给value
  • T:表示断言的类型

演示:

func main() {
	var i interface{}
	i = 123

	// 如果i是int类型就会把结果赋值给ok,把数据(123)赋值给value
	value, ok := i.(int)
	if ok {
		fmt.Println("断言成功:", value)
	} else {
		fmt.Println("断言失败")
	}
}

接口作为函数参数,断言也可以结合分支语句、循环语句

func main() {
	var i interface{}
	i = false
	Test(i)
}

func Test(i interface{}) {
	switch i.(type) {
	case int:
		fmt.Println("是int类型")
	case bool:
		fmt.Println("是bool类型")
	case string:
		fmt.Println("是string类型")
	default:
		fmt.Println("啥也不是")
	}
}

计算器案例:

func main() {
	var c ObjectInitialization
	result := c.Create("+", 1, 2)
	fmt.Println(result)
}

// 接口
type Calculate interface {
	GetResult() int
}

// 公共参数类
type Num struct {
	num1, num2 int
}

// 加法类
type Add struct {
	Num
}

func (add *Add) GetResult() int {
	return add.num1 + add.num2
}

// 减法类
type Sub struct {
	Num
}

func (sub *Sub) GetResult() int {
	return sub.num1 - sub.num2
}

// 乘法类
type Multiplication struct {
	Num
}

func (multiplication *Multiplication) GetResult() int {
	return multiplication.num1 * multiplication.num2
}

// 除法类
type DivisionMethod struct {
	Num
}

func (divisionMethod *DivisionMethod) GetResult() int {
	return divisionMethod.num1 / divisionMethod.num2
}

// 用于完成选择哪个方法的调用
type ObjectInitialization struct{}

func InvokingFunction(c Calculate) int {
	return c.GetResult()
}
func (o *ObjectInitialization) Create(oi string, num1, num2 int) int {
	switch oi {
	case "+":
		add := Add{Num{num1, num2}}
		return InvokingFunction(&add)
	case "-":
		sub := Sub{Num{num1, num2}}
		return InvokingFunction(&sub)
	default:
		return 0
	}
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Go_接口、多态、接口继承、空接口、类型断言 的相关文章

  • 【Golang入门】Golang第一天心得

    生活所迫 入门一下Go 很奇葩的第一点 接口 package main import fmt 定义一个接口 type Shape interface Area float64 定义一个矩形类型 type Rectangle struct W
  • golang基础教程

    目录 golang基础教程 一 环境搭建 golang基础教程 二 开发规范及API golang基础教程 三 变量与数据类型概述 golang基础教程 四 基本数据类型 golang基础教程 五 基本数据类型的转换 golang基础教程
  • Golang-使用 goroutine 运行闭包的“坑”

    介绍 在 Go 语言中 函数支持匿名函数 闭包就是一种特殊的匿名函数 它可以用于访问函数体外部的变量 需要注意的是 在 for range 中 使用 goroutine 执行闭包时 经常会掉 坑 因为匿名函数可以访问函数体外部的变量 而 f
  • Java学习13:面向对象-多态(Polymorphism)内存分析图解

    1 概述 多态是Java面向对象三大特征之一 多态 Polymorphism 顾名思义 即对象具有多种形态 具体而言 是编译时类型 运行时类型 编译时类型 由声明时的类型决定 一般是父类 运行时类型 由实际对应的对象类型决定 具体是哪个子类
  • Qt webengine 显示web页面、前后端通信以及下载详解

    概述 官方文档 https doc qt io archives qt 5 11 qtwebengine overview html 翻译文档 Qt5 9 WebEngine 概述 一花一世界 一叶一乾坤 博客园 从Qt5 5开始 Qt W
  • go 进阶 go-zero相关: 七. 拦截器与熔断拦截器

    目录 一 拦截器的基础使用 1 服务端拦截器 2 客户端拦截器 二 拦截器底层底层执行原理 三 go zero默认添加的拦截器 客户端 1 熔断器拦截器 BreakerInterceptor 服务端 一 拦截器的基础使用 在go zero
  • goland环境配置

    goland modules环境配置 下载和安装goland 环境配置 配置环境变量GOPATH 配置go modules GOPROXY代理的系统变量 工程目录中新建三个工作目录 goland中启用go modules 新建一个go程序
  • 深入理解 Go 语言中的接口(interface)

    一 GoLang 接口的定义 1 GoLang 中的接口 在 Go 语言中接口 interface 是一种类型 一种抽象的类型 接口 interface 定义了一个对象的行为规范 只定义规范不实现 由具体的对象来实现规范的细节 实现接口的条
  • 掌握 Go 语言中的循环结构:从基础到高级

    一 if else 分支结构 1 if 条件判断基本写法 package main import fmt func main score 65 if score gt 90 fmt Println A else if score gt 75
  • 48.Go简要实现令牌桶限流与熔断器并集成到Gin框架中

    文章目录 一 简介 二 限流器与熔断器在微服务中的作用 1 限流器 对某个接口单位时间内的访问量做限制 2 熔断器 当服务连续报错 超过一定阈值时 打开熔断器使得服务不可用 三 具体实现 1 限流器实现逻辑 以令牌桶算法为例 2 限流器集成
  • 【go语言开发】Minio基本使用,包括环境搭建,接口封装和代码测试

    本文主要介绍go语言使用Minio对象存储 首先介绍搭建minio 创建bucket等 然后讲解封装minio客户端接口 包括但不限于 上传文件 下载 获取对象url 最后测试开发的接口 文章目录 前言 Minio docker安装mini
  • go-zero开发入门之网关往rpc服务传递数据2

    go zero 的网关服务实际是个 go zero 的 API 服务 也就是一个 http 服务 或者说 rest 服务 http 转 grpc 使用了开源的 grpcurl 库 当网关需要往 rpc 服务传递额外的数据 比如鉴权数据的时候
  • go-zero目录结构和说明

    code of conduct md 行为准则 CONTRIBUTING md 贡献指南 core 框架的核心组件 bloom 布隆过滤器 用于检测一个元素是否在一个集合中 breaker 熔断器 用于防止过多的请求导致系统崩溃 cmdli
  • Go 语言中切片的使用和理解

    切片与数组类似 但更强大和灵活 与数组一样 切片也用于在单个变量中存储相同类型的多个值 然而 与数组不同的是 切片的长度可以根据需要增长和缩小 在 Go 中 有几种创建切片的方法 使用 datatype values 格式 从数组创建切片
  • 【golang】go执行shell命令行的方法( exec.Command )

    所需包 import os exec cmd 的用法 cmd exec Command ls lah ls是命令 后面是参数 e cmd Run 多个参数的要分开传入 如 ip link show bond0 cmd
  • 协程-单线程内的异步执行

    1 仿协程实例 不同事件依次顺序执行 coding utf 8 import time def calculate 1 step event name for index in range step print This is s even
  • 【go语言】error错误机制及自定义错误返回类型

    简介 Go 语言通过内置的 error 接口来处理错误 该接口定义如下 type error interface Error string 这意味着任何实现了 Error 方法的类型都可以作为错误类型 在 Go 中 通常使用 errors
  • go开发--操作mysql数据库

    在 Go 中访问 MySQL 数据库并进行读写操作通常需要使用第三方的 MySQL 驱动 Go 中常用的 MySQL 驱动有 github com go sql driver mysql 和 github com go xorm xorm
  • Golang拼接字符串性能对比

    g o l a n g golang g o l an g
  • go cannot find package “github.com/gorilla/websocket“解读

    Go无法找到包 github com gorilla websocket 的解决方案 在Go开发过程中 我们经常会依赖第三方库来简化开发工作 而使用 go get 命令安装这些库时 有时候我们可能会遇到类似于以下错误的情况 plaintex

随机推荐

  • linux入门系列20--Web服务之LNMP架构实战

    作为本入门系列最后一篇文章 将演示如何在CentOS7环境下搭建LNMP环境来构建个人博客网站 常见搭建网站的方式有LAMP LNMP IIS Nginx Tomcat等等 本文演示比较流行的基于LNMP方式来搭建动态WEB网站 正如前文
  • VScode配置C++(win11)以及Vscode的一些使用问题

    目录 一 下载VScode 省略 二 下载编译器 mingw 三 配置 vscode 四 补充 配置好后 输出中文会乱码 五 文件参数讲解 六 多文件编译 修改task json 七 中文问题 一 下载VScode 省略 二 下载编译器 m
  • 测试设计提升之路

    当前软件行业中有很多职位 其中开发与测试可以说是TOP2热门 测试相对开发来说入门容易 但要快速达到巅峰 我们需要掌握一些方法与套路 测试工作是一个繁琐的工作 一个人的精气神有限 在规定的时间内需要掌握多种技术 而且要达到精通非常困难 就测
  • java 使用匿名内部类的方式创建线程并设置和获取线程名字

    有些方法需要传入接口的实例或者抽象类的实例对象 比如Thread有一个构造方法 Thread Runnable target 这时可以可以自定义类实现Runnable接口 重写接口中的方法 将自定义类的对象传入构造方法中 也可以使用匿名内部
  • K8S学习--Kubeadm-7--Ansible二进制部署

    K8S学习 Kubeadm 安装 kubernetes 1 组件简介 K8S学习 Kubeadm 安装 kubernetes 2 安装部署 K8S学习 Kubeadm 3 dashboard部署和升级 K8S学习 Kubeadm 4 测试运
  • C++ 智能指针详解

    点击蓝字 关注我们 参考资料 C Primer中文版 第五版 我们知道除了静态内存和栈内存外 每个程序还有一个内存池 这部分内存被称为自由空间或者堆 程序用堆来存储动态分配的对象即那些在程序运行时分配的对象 当动态对象不再使用时 我们的代码
  • 查找数组中第二大的数

    快速找出一个数组中的最大数 第二大数 思路 如果当 前元素大于最大数 max 则让第二大数等于原来的最大数 max 再把当前元素的值赋给 max 如果当前的元素大于等于第二大数secondMax的值而小于最大数max的值 则要把当前元素的值
  • 第6天-[21天学Python]-面向对象编程以及类的属性和方法

    本章的主要内容有 对象概述 类与对象 定义与使用类 类的属性与方法 类的继承 类的方法重载 1 面向对象编程 1 1 万物皆对象 程序对现实中的事物进行有目的的抽象 面向对象编程就是通过面向对象分析与设计 建立模型 类或对象 并完成最终程序
  • java代码上传本地图片返回地址

    有时候我也很迷这个到底是怎么上传的 写这篇为了给自己看的 大家可参照 Value constantvalue uploadPath private String uploadPath Value constantvalue hostname
  • 极大似然估计详解

    极大似然估计 以前多次接触过极大似然估计 但一直都不太明白到底什么原理 最近在看贝叶斯分类 对极大似然估计有了新的认识 总结如下 贝叶斯决策 首先来看贝叶斯分类 我们都知道经典的贝叶斯公式 其中 p w 为先验概率 表示每种类别分布的概率
  • 【源码+文档】爬虫检索系统

    实验内容 从Top250电影榜单上爬取所有电影的相关信息 包括影片海报 影片海报链接 影片中外文名 影片评分 影片评价人数 影片概况 影片缩略信息 例如 导演 部分演员 上映时间 电影类型等等 将海报以 jpg形式 将其他信息以excel文
  • 游戏币java_Java实现蓝桥杯分金币

    分金币 圆桌旁坐着n个人 每人有一定数量的金币 金币总数能被n整除 每个人可以给他左右相邻的人一些金币 最终使得每个人的金币数目相等 你的任务是求出被转手的金币数量的最小值 比如 n 4 且4个人的金币数量分别为1 2 5 4时 只需转移4
  • 【Antlr】ANTLR语法规则

    1 概述 ANTLR语法规则的主要工作是定义词法解析规则和语法解析规则 ANTLR约定词法解析规则以大写字母开头 语法解析规则以小写字母开头 下面简单介绍一下ANTLR的规则 首先需要定义Grammar类型及名称 名称必须和文件名一样 有L
  • 每日一题 337. 打家劫舍 III

    难度 中等 整体思路相当于是前两天的方法倒过来 毕竟二叉树最常用的解法就是递归倒推 对于每一颗子树 他必定有一种最大的盗取方法 但是只有它的 root 的盗取情况才会影响到 root 的父节点 即如果收益最大的盗取方法中不盗取 root 那
  • anaconda 2023.3 win10 安装,镜像配置,存储路径更改超详细教程

    现在 ai 很火 做 ai 开发 离不开 python anaconda 是 python 开发的重要工具 这里介绍一下 anaconda 最新版的 2023 3 在 win10 的安装 镜像配置 以及虚拟环境存储路径的更改 1 anaco
  • (48.4)【WAF绕过】SQL注入、文件上传、XSS

    目录 一 SQL注入绕过 二 文件上传绕过 三 xss绕过 一 SQL注入绕过 WAF绕过基础分析和原理 注入绕过WAF方法分析https blog csdn net qq 53079406 article details 12314769
  • 深度学习2015年文章整理(CVPR2015)

    国内外从事计算机视觉和图像处理相关领域的著名学者都以在三大顶级会议 ICCV CVPR和ECCV 上发表论文为荣 其影响力远胜于一般SCI期刊论文 这三大顶级学术会议论文也引领着未来的研究趋势 CVPR是主要的计算机视觉会议 可以把它看作是
  • 【JavaWeb】 练习二

    1 gt 实现登录 如果用户名密码错误 转入到登录页面 提示信息 用户名密码错误 2 gt 如果用户不登录 直接访问展示页面 也需要转入到登录页面 提示信息 请先登录在访问 3 gt 实现退出功能 转到登录页面 4 gt 统计查看展示页面的
  • 必杀VI、VIM编辑器命令

    题记 VI和VIM有非常多的命令 在此分部分展示一下 第一部分 一 移动光标类 一般模式 光标移动 复制粘贴 查找替换 上下移动 h lt 光标向左移动一个字符 j 向上箭头 光标向上移动一个字符 k 向下箭头 光标向下移动一个字符 l 向
  • Go_接口、多态、接口继承、空接口、类型断言

    接口 接口是把所有具有共性的方法定义在一起 是方法集 任何类型实现了接口中所有的方法 就是实现了这个接口 接口可以实现多态 接口传递的是地址值 接口定义及调用 定义格式 tepe 接口名 interface 方法名 参数 返回值 调用格式1