Go-学会 Go 中 interface 的基本使用

本节重点:

  • 学会 Go 中 interface 的基本使用

在 Go 中,接口类型是一种抽象类型,是方法的集合,其他类型实现了这些方法就是实现了这个接口。

声明和实现接口

在 Go 中接口的声明如下:

/* 定义接口 */
type interface_name interface {method_name1 [return_type]method_name2 [return_type]method_name3 [return_type]...method_namen [return_type]
}

简单示例

现在我们通过一个简单的示例来看是如何创建接口并实现它:

package mainimport (  "fmt"
)//interface definition
type VowelsFinder interface {  FindVowels() []rune
}type MyString string//MyString implements VowelsFinder
func (ms MyString) FindVowels() []rune {  var vowels []runefor _, rune := range ms {if rune == 'a' || rune == 'e' || rune == 'i' || rune == 'o' || rune == 'u' {vowels = append(vowels, rune)}}return vowels
}func main() {  name := MyString("Sam Anderson")var v VowelsFinderv = name // possible since MyString implements VowelsFinderfmt.Printf("Vowels are %c", v.FindVowels())}

在上面程序第8行中,创建了一个名为 VowelsFinder 的接口类型,它有一个方法 FindVowels() []rune

在下一行中创建一个类型 MyString 它只是 string 的包装类。

在第15行中,我们将方法 FindVowels()[]rune 添加到接收方类型 MyString 中。现在 MyString 被认为实现了 VowelsFinder 接口。这与 Java 等其他语言非常不同,在 Java 中,类必须使用 implements 关键字显式地声明它实现了接口。如果类型包含接口中声明的所有方法,则 go 和 go 接口将隐式实现。

在第28行,我们将 MyString 类型的 name 赋给 v 类型的 VowelsFinder。这是可能的,因为 MyString 实现了 VowelsFinder。下一行调用 MyString 类型上的 FindVowels 方法,并打印字符串中所有的元音 Sam Anderson。这个程序输出的 Vowels are [a e o]

这样已经创建并实现了第一个接口。

空接口

一个没有方法的接口称为空接口。它表示为 interface{}。由于空接口没有任何方法,所以所有类型都实现空接口。

package mainimport (  "fmt"
)func describe(i interface{}) {  fmt.Printf("Type = %T, value = %v\n", i, i)
}func main() {  s := "Hello World"describe(s)i := 55describe(i)strt := struct {name string}{name: "Naveen R",}describe(strt)
}

在上面的程序中第 7 行,describe(i interface{}) 函数接受一个空接口作为参数,因此它可以传递任何类型。
我们将字符串、int 和 结构体分别传递给第 13、15 和 21 行中的 describe 函数。这个程序打印

类型断言

类型断言用于提取接口的基础值。

i.(T)是用于获取具体类型为T的接口i的底层值的语法。
一个程序值一千字😀。让我们为类型断言写一个。

package mainimport (  "fmt"
)func assert(i interface{}) {  s := i.(int) //get the underlying int value from ifmt.Println(s)
}
func main() {  var s interface{} = 56assert(s)
}

第12行中的 s 的具体类型是 int。我们使用第8行中的 i.(int) 语法来获取 i 的底层 int 值。这个程序打印 56
如果上面程序中的具体类型不是 int 会发生什么?好吧,让我们来了解一下。

package mainimport (  "fmt"
)func assert(i interface{}) {  s := i.(int) fmt.Println(s)
}
func main() {  var s interface{} = "Steven Paul"assert(s)
}

在上面的程序中,我们将具体类型strings传递给assert函数,试图从中提取 int 值。这个程序会因为这个问题而报错panic: interface conversion: interface {} is string, not int
为了解决上述问题,我们可以使用语法

v, ok := i.(T)

如果 i 的具体类型是 T,那么 v 的值就是 iok 为 true

如果 i 的具体类型不是 T,那么 ok 将是 falsev 将是类型 T 的零值,程序不会报错。

package mainimport (  "fmt"
)func assert(i interface{}) {  v, ok := i.(int)fmt.Println(v, ok)
}
func main() {  var s interface{} = 56assert(s)var i interface{} = "Steven Paul"assert(i)
}

Steven Paul被传递给assert函数时,ok 将为 false,因为i具体类型不是int,并且v为 0值。该程序将打印:

56 true  
0 false 

注意:

  • 上面所有示例接口都是使用值接收器实现的。也可以使用指针接收器来实现接口。但是会有一些微妙的区别?动手试试!

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

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

相关文章

Mac上的最佳3D建模工具-犀牛Rhinoceros 8 for Mac v8.6.24101.05002完美兼容激活

Rhino 8是一款计算机辅助设计(CAD)和三维建模软件,由美国公司McNeel & Associates开发。它是Rhino系列的最新版本,用于创建、编辑、分析、渲染和动画三维模型。 以下是Rhino 8的一些主要特点和功能: 1. **强大的…

Spring Boot与Vue联手打造智能化学生选课平台

末尾获取源码作者介绍:大厂全栈码农|毕设实战开发,专注于大学生项目实战开发、讲解和毕业答疑辅导。 更多项目:CSDN主页YAML墨韵 学如逆水行舟,不进则退。学习如赶路,不能慢一步。 目录 一、项目简介 二、开发技术与…

Scaffold-GS 代码阅读笔记

1. 系统启动部分 使用 python 中的 parser 库 为配置系统的参数设定, 和3DGS 类似,并且使用safe_state(args.quiet) 函数 为每一次的 log 输出加上对应的 时间戳 ## 配置参数的设定lp ModelParams(parser)op OptimizationParams(parser)pp PipelineParams(pars…

分布式向量数据库-安装部署

下载 GitHub - pgvector/pgvector: Open-source vector similarity search for Postgres 源码编译 ##文件解压缩 unzip pgvector-0.6.2.zip ##编译 make && make install 功能验证 #安装扩展CREATE EXTENSION vector;#创建测试表CREATE TABLE items (id bigseri…

TPCH 工具dbgen的安装与使用

最近需要测试MySQL 数据库的tpc-h性能,记录下 下载工具包 在TPC-H Homepage 这个网站下载TCPH的zip包,需要填信息(这里有时需要科技网,不然会莫名报错。) 编译 dbgen 下载后解压,然后修改 dbgen/makefi…

【算法】哈希表

个人主页 : zxctscl 如有转载请先通知 题目 1. 1. 两数之和1.1 分析1.2 代码 2. 面试题 01.02. 判定是否互为字符重排2.1 分析2.2 代码 3. 217. 存在重复元素3.1 分析3.2 代码 4. 219. 存在重复元素 II4.1 分析4.2 代码 5. 49. 字母异位词分组5.1 分析5.2 代码 1. 1…

Gateway的简单介绍和使用

1、Gateway简介: Gateway 是一种 API 网关(API Gateway)技术,它作为微服务架构中的关键组件,负责为系统的外部请求与内部服务之间提供统一的接入点。Spring Cloud Gateway 是基于 Spring 生态系统实现的一个高性能、易…

2024.4.11

1.思维导图 2.指针形式验证大小端存储 #include<myhead.h>int main(int argc, const char *argv[]) {int num 0x12345678;char* ptr (char *)&num;if(*ptr 0x12){printf("big endian\n");}else if(*ptr 0x78){printf("little endian\n");}r…

MINI2440 开发板 给他干出来了

环境是ubuntu14.04。不要问我为什么是这个版本&#xff0c;因为之前的ubuntu12.04 环境干不出来&#xff0c;你去试试就知道了&#xff01;各种资源包下载不下来。 输入启动参数&#xff1a; 进入MINI2440&#xff1a;别说心里一万个开心&#xff0c;启动完成&#xff0c;输入p…

【电子通识】热风枪的结构与使用方法

热风枪的结构 热风枪是专门用来拆焊、焊接贴片元器件和贴片集成电路的焊接工具&#xff0c;它主要由主机和热风焊枪两大部分构成。 热风枪主要有电源开关、风速设置、温度设置、热风连接等部件组成。根据不同品牌和价位的热风枪&#xff0c;有一些功能齐全的也集成了烙铁功能。…

负荷预测 | Matlab基于TCN-LSTM-Attention单输入单输出时间序列多步预测

目录 效果一览基本介绍程序设计参考资料 效果一览 基本介绍 1.负荷预测 | Matlab基于TCN-LSTM-Attention单输入单输出时间序列多步预测&#xff1b; 2.单变量时间序列数据集&#xff0c;采用前12个时刻预测未来96个时刻的数据&#xff1b; 3.excel数据方便替换&#xff0c;运行…

江苏开放大学2024年春《市场营销学 060043》形考作业2:单元三——单元五参考答案

答案&#xff1a;更多答案&#xff0c;请关注【电大搜题】微信公众号 答案&#xff1a;更多答案&#xff0c;请关注【电大搜题】微信公众号 答案&#xff1a;更多答案&#xff0c;请关注【电大搜题】微信公众号 单选题 1一手资料主要是来自&#xff08;  &#xff09;…

【鸿蒙开发】系统组件Column

Column组件 Column沿垂直方向布局的容器。 接口&#xff1a; Column(value?: {space?: string | number}) 参数&#xff1a; 参数名 参数类型 必填 参数描述 space string | number 否 纵向布局元素垂直方向间距。 从API version 9开始&#xff0c;space为负数或者…

Mongodb入门--头歌实验MongoDB 之滴滴、摩拜都在用的索引

MongoDB 常用于大数据的存储&#xff0c;在庞大的数据中查询出我们所要的信息&#xff0c;如果使用普通查询方法&#xff0c;遍历所有文档查询&#xff0c;花费的时间太久了。 假设现在有个集合 person&#xff0c;查询命令&#xff1a;db.person.find( {age: 18} )&#xff0…

Centos7 开机进入图形界面以及解决startx进入不了图形界面的问题

Centos7 开机进入图形界面以及解决startx进入不了图形界面的问题 1、开机进入图形界面2、开机进入DOS界面3、解决startx进入不了图形界面的问题 1、开机进入图形界面 systemctl set-default graphical.target 2、开机进入DOS界面 systemctl set-default multi-user.target 3、…

电机驱动专题-理论学习-计算整数化

计算定点化 标幺化标幺化简介标幺化的优点原理讲解 Q格式化 电机驱动在讲究成本的情况下&#xff0c;有很多在M3、M0、甚至STM8芯片上开发正弦波驱动的需求&#xff0c;而这些芯片没有一个支持DSP运算、定点、浮点运算&#xff08;M4内核的开始支持DSP运算&#xff0c;浮点运算…

熟练使用Nacos、GateWay、OpenFeign、Sentinel常用组件

Nacos 面试题&#xff1a; 请简述Nacos是什么&#xff0c;它主要解决了什么问题&#xff1f;Nacos提供了哪些核心功能&#xff1f;Nacos是如何支持服务发现的&#xff1f;如何使用Nacos作为配置中心&#xff1f;Nacos的集群部署是如何实现的&#xff1f; 答案&#xff1a; …

libVLC 视频窗口上叠加透明窗口

很多时候&#xff0c;我们需要在界面上画一些三角形、文字等之类的东西&#xff0c;我们之需要重写paintEvent方法&#xff0c;比如像这样 void Widget::paintEvent(QPaintEvent *event) 以下就是重写的代码。 void Widget::paintEvent(QPaintEvent *event) {//创建QPainte…

振动信号频域图绘制函数(python版)

在实际应用中&#xff0c;不免会看时域图和频域图&#xff0c;封装了绘制时域图和频域图程序&#xff0c;方便调用 ## 导入包 from matplotlib import pyplot as plt from matplotlib import rcParams import numpy as np import pandas as pdconfig {"font.family"…

创新指南|战略衡量的增长组织:用人工智能增强关键绩效指标(KPI)

传统的关键绩效指标 (KPI)越来越无法提供领导者取得成功所需的信息和见解。他们在跟踪进展、协调人员和流程、确定资源优先级以及推进问责制方面存在不足。本文是 2024 年第一份麻省理工学院 SMR - BCG 人工智能和商业战略全球高管学习和研究项目的调查结果——人工智能和业务战…