Go语言学习笔记 --- interface

Go 学习笔记 · 进阶篇 · 第一天:接口与多态 在 Go 里,接口(interface)是一种类型定义,它只管“你要会什么”,不管“你来自哪”。🧠 通俗点讲:你不用举手说“我实现了这个接口”,只要你偷偷写了接口里的方法,你就自动成为合法公民。return "汪汪!fmt.Println(a.Speak()) // 输出:汪汪!注意:你没写implements,也没继承谁,甚至没人发你工牌,就这样,你就上岗了!自由之光,照耀你我。接口是抽象契约,不靠关键字,全靠你“长得像”。多态靠接口,不靠继承,写法简单,自由优雅。 阅读详情

学习笔记根据 无闻 go语言基础教程 整理

interface

  • 接口是一个或多个方法签名的集合
  • Go 语言中所有类型都实现了空接口 (空接口是没有任何东西的接口)
  • 只要某个类型拥有该接口的所有方法签名,即算实现该接口,无需显示声明实现了哪个接口,这称为Structural Typing
  • 接口只有方法声明,没有实现,没有数据字段
  • 接口可以匿名嵌入其他接口,或嵌入到结构中
  • 将对象赋值给接口时,会发生拷贝,而接口内部存储的是指向这个复制品的指针,即无法修改复制品的状态,也无法获取指针
  • 只有当接口存储的类型和对象都为nil时,接口才等于nil
  • 接口调用不会做receiver的自动转换
  • 接口同样支持匿名字段方法
  • 接口也可实现类似OOP中的多态
  • 空接口可以作为任何类型数据的容器
  • 通过类型断言的ok pattern 可以判断接口中的数据类型
  • 使用 type switch 则可针对空接口进行比较全面的类型判断
  • 可以将拥有超集的接口转换为子集的接口
  • 示例代码:
package main

import (
    "fmt"
)

// 此处演示空接口
type empty interface {

}

type USB interface {
    Name() string // name 方法 返回名称 string是返回类型
    Connect()
    Showing // 此处是接口的嵌套继承
}

type Showing interface {
    Show()
}

// 定义一个结构体为了实现上述的USB接口
type PhoneConnecter struct {
    name string
}

// 模拟实现的方法 Name
func (pc PhoneConnecter) Name() string {
    return pc.name
}

//模拟实现方法 Connect
func (pc PhoneConnecter) Connect () {
    fmt.Println("Connect:", pc.name)
}

//模拟实现方法 Connect
func (pc PhoneConnecter) Show () {
    fmt.Println("Showing:", pc.name)
}

// 测试方法
func Disconnect(usb USB) {
    if pc, ok := usb.(PhoneConnecter); ok {
        fmt.Println("Disconnected.", pc.name)
        return
    }
    fmt.Println("Unknown device.")
}

// 测试方法2 传入空接口
func Disconnect2(usb interface{}) {
    if pc, ok := usb.(PhoneConnecter); ok {
        fmt.Println("Disconnected.", pc.name)
        return
    }
    fmt.Println("Unknown device.")
}

// 测试方法3 使用switch来判断不同传入值的类型
func Disconnect3(usb interface{}) {
    switch v:= usb.(type) {
        case PhoneConnecter:
            fmt.Println("Disconnected.", v.name)
        default:
            fmt.Println("Unknown device.")
    }
}

func main() {
    test1()
    test2()
    test3()
    test4()
    test5()
    test6()
    test7()
    test8()
}

// 显式实现
func test1() {
    var a USB // 这个意思是 a 实现了USB的接口
    a = PhoneConnecter{"PhoneConnecter"}
    a.Connect() // Connect: PhoneConnecter
    Disconnect(a) // Disconnected. PhoneConnecter // 说明自动实现了
}

// 未显示实现
func test2() {
    a := PhoneConnecter{"PhoneConnecter"} // 此处未直接实现 准备测试 Structural Typing机制
    a.Connect() // Connect: PhoneConnecter
    Disconnect(a) // Disconnected. PhoneConnecter // 说明自动实现了
}

// 未显示实现 使用Disconnect2方法,测试传入空接口
func test3() {
    a := PhoneConnecter{"PhoneConnecter"} // 此处未直接实现 准备测试 Structural Typing机制
    a.Connect() // Connect: PhoneConnecter
    Disconnect2(a) // Disconnected. PhoneConnecter // 说明自动实现了
}

// 未显示实现 使用Disconnect2方法,测试使用switch
func test4() {
    a := PhoneConnecter{"PhoneConnecter"} // 此处未直接实现 准备测试 Structural Typing机制
    a.Connect() // Connect: PhoneConnecter
    Disconnect3(a) // Disconnected. PhoneConnecter // 说明自动实现了
}

// 接口之间的转换,只能从超集的接口转换到子集的接口
func test5() {
    pc := PhoneConnecter{"PhoneConnecter"} // 此处由于Structural Typing机制 默认实现了USB接口
    var a Showing // a 实现 Showing 接口
    a = Showing(pc) // 将USB类型的接口强制转换成Showing类型的接口
    a.Show() // Showing:PhoneConnecter
    // a.Name() // 尝试调用USB接口中的方法,此处会报错, a 已经被降级了
}

// 测试:直接修改属性是可以的
func test6() {
    pc := PhoneConnecter{"PhoneConnecter"}
    pc.name = "pc"
    pc.Connect() // Connect: pc // 说明:此处修改了
}

// 测试 :将对象赋值给接口时,会发生拷贝,而接口内部存储的是指向这个复制品的指针,即无法修改复制品的状态,也无法获取指针
func test7() {
    pc := PhoneConnecter{"PhoneConnecter"}
    var a Showing
    a = Showing(pc)
    a.Show() // Showing: PhoneConnecter
    pc.name = "pc" // 尝试修改复制品的状态
    a.Show() // Showing: PhoneConnecter // 说明尝试失败
}

// 测试:只有当接口存储的类型和对象都为nil时,接口才等于nil
func test8() {
    var a interface{}
    fmt.Println(a == nil) // true

    var p * int = nil
    a = p // a 指向 p
    fmt.Println(a == nil) // false
}
linux应用程序段错误调试 一、堆、栈 在分析段错误之前,先了解一下什么是堆?什么是栈? 堆:一般由开发者分配释放,如果没有释放,程序结束时,在有的OS中可能会被自动释放,分配方式类似于链表。堆的操作方式为,队列优先,先进先出的原则。 栈:由操作系统自动分配,存放函数的参数值,局部变量。栈的操作方式为,先进后出的原则。 堆栈中定义了一些操作。 两个最重要的是PUSH和POP。  PUSH:操作在堆栈的顶部加入一个元素... 阅读详情

相关推荐

基于高精度三维机器视觉的新能源汽车锂电池表面缺陷检测

在机器视觉行业迅速发展的背景下,市场上提供了功能强大且种类齐全的3D相机系列,可以满足锂电池从电芯到模组各个工艺和工位的3D检测需求。

Hinyeung_Limited的博客 1135

go语言学习:方法

一、方法定义 Golang 方法总是绑定对象实例,并隐式将实例作为第一实参 (receiver)。 • 只能为当前包内命名类型定义方法。 • 参数 receiver 可任意命名。如方法中未曾使用 ,可省略参数名。 • 参数 receiver 类型可以是 T 或 *T。基类型 T 不能是接口或指针。 • 不支持方法重载,receiver 只是参数签名的组成部分。 • 可用实例 valu...

Mr_qing的博客 455

Mplus实战:三变量随机截距交叉滞后模型(RI-CLPM)语法详解与扩展

本文详细解析了Mplus中三变量随机截距交叉滞后模型(RI-CLPM)的构建原理与语法实现。通过将变量分解为稳定的个体间差异与动态的个体内波动,模型能更纯净地揭示多变量间的纵向交互影响。文章以工作压力、睡眠质量与工作满意度为例,提供了完整的语法模板、关键参数设置(如NOCOV命令、残差相关)及结果解读指南,帮助研究者避开常见误区,稳健分析复杂动态关系。

wdx0123456的博客 930

Golang学习之方法

方法 Go中虽没有class,但依旧有method 通过显示说明receiver来实现与某个类型的结合 只能为同一个包中的类型定义方法 receiver可以是类型的值或者指针 不存在方法重载 可以使用值或指针来调用方法,编译器会自动完成转换 从某种意义上来说,方法是函数的语法糖,因为receiver其实就是方法所接收的第一个参数(Method Value vs. Method Expressio...

huang_yong_peng的博客 1352

解决windows10下无法安装.net framework 3.5(包括.net2.0和3.0)

入域电脑,win10系统中安装 .net framework 3.5(包括.net2.0和3.0)

God_me_1的博客 4万+

MS17-010(Eternal blue永恒之蓝)漏洞利用+修复方法

msf永恒之蓝漏洞复现过程以及修复建议

记录学习 8518

Go语言学习笔记(一)

Go语言学习整理 本文基于菜鸟教程,对于自己不明白的点加了点个人注解,对于已明确的点做了删除,可能结构不太清晰,看官们可移步Go语言教程 1 Go语言结构 当标识符(包括常量、变量、类型、函数名、结构字段等等)以一个大写字母开头,如:Group1,那么使用这种形式的标识符的对象就可以被外部包的代码所使用(客户端程序需要先导入这个包),这被称为导出(像面向对象语言中的 public);标识...

暗焰之珩的博客 1万+

2022年灌溉试验设计与数据分析考试试题

2.表2数据为表层0~10cm的原状土离心机土壤水分特征曲线试验数据,(1)请利用R语言nls函数通过Van Genuchten方程对土壤体积含水率和土壤基质势进行拟合;(3)指明土壤基值势为-33 kPa和-1500kPa时的体积含水率。1.请根据表1数据,以灌溉模式为主区,生物炭用量为子区,利用R语言agricolae包生成裂区试验设计试验处理布置图;3.以R工具包factoextra中decathlon2数据集前10列为数据进行PCA分析,要求计算出(1)前5个主成分的特征值、特征向量;

Mrrunsen的博客 267

Go语言实现多个方法解决10个经典数组问题(一)

目录 题目1:在数组中找唯一重复的元素(5种方法+1个扩展) 题目2:要求找出数组中的最大值和最小值(3种方法) 题目3:实现找出旋转数组指定区间的最小值(1种方法2个扩展) 题目5:数组长为N+2,2个数出现奇数次,找出它们(2种方法) 题目6:快速地求出该数组中第k小的数(3种方法1个扩展) 题目7:找出给定数组中两个元素的最短距离(2种方法) 题目8:找到三原组中三元组最短的距离(2种方法) 题目9:找出有序数组中绝对值最小的数(2种方法) 题目10:找出连续子数组和的最大值和位

微积冰 1241

TC3XX - MCAL知识点(九):PWM EB-tresos配置说明及代码浅析

脉冲宽度调制(PWM)驱动器负责提供与AUTOSAR指定的PWM信号生成相关的标准服务。PWM通道的底层定时器驱动是GTM (TOM或ATOM片)或CCU6 (T12或T13片)定时器通道。软硬件匹配关系如下:PWM直接引用的是GTM与CCU6模块,然后GTM与CCU6再关联到Port的,根据软硬件匹配关系,也能调用中断来使用,本例子没使用中断。CCU6是一个高分辨率的16位捕获和比较单元,具有特定的应用模式,主要用于交流驱动控制。特殊的工作模式支持控制无刷直流电机使用霍尔传感器或反电动势检测。

梦想技术家 2889

肺癌术后随访离散选择实验(DCE)设计与SAS实现

随着肺癌早期诊断和治疗技术的进步,肺癌患者的生存率显著提高,术后随访管理成为提升患者生活质量的关键环节。然而,如何在有限的医疗资源下设计出既符合患者需求又具有成本效益的随访方案,是临床决策面临的重要挑战。 离散选择实验(Discrete Choice Experiment, DCE)是一种定量研究方法,通过模拟真实世界的选择情境,测量患者对不同随访方案属性的偏好程度。本研究旨在通过DCE方法,系统评估肺癌术后患者对随访服务的偏好,为制定以患者为中心的随访策略提供循证依据。

huanghm88的专栏 101

想要学好Go语言的必须知道的一个小技巧

由于我转Go语言比较早,很多认识我的,转Go或学习Go的同学遇到问题,经常会过来问我,然后,我发现。 除了学习Go语言可以看那些资料,这个问题以外,第二个经常被问的问题就是 “大佬,这个包下载 go get不下来怎么办啊。” “大哥,cli下怎么设置代理啊” “大神,怎么cli设置了代理还是 go get 不到包。” 等等…… 因此,我决定做一个简单科普。 linux、macOS 使...

PHP架构师的博客 1957

【Halcon-2D测量】set_metrology_object_param 函数功能(用于配置计量对象常规参数)

HALCON算子 set_metrology_object_param 是2D计量模块的核心配置工具,用于动态修改计量对象的测量区域、边缘检测和几何拟合参数。该算子需在检测前调用,支持批量或单独修改对象参数,包含三类关键参数:测量区域(如长度、间距)、边缘检测(如平滑Sigma、阈值)和几何拟合(如RANSAC阈值、最小分数)。使用时需注意参数互斥规则(如measure_distance优先于num_measures)和多线程同步要求。算子无输出参数,仅修改计量模型内部状态,需配合apply_metrolo

weixin_45590420的博客 295

GO语言学习笔记———interface

GO的接口 1、接口的简单实现 GO的接口没有java里implement这种东西,而是应用了duck-type的形式,所以GO。所谓duck-type就是说你看到一个东西长着脚蹼和扁嘴像鸭子,所以认为他是鸭子。2333这解释是不是有点傻,总之就是说看着像什么就认为是什么。 看下代码: type helloworld interface {//定义helloworld接口 white() ...

weixin_43256892的博客 259

NTscan扫描工具

ntscan是一个扫描器,可以扫描没有密码和弱密码的共享,先到配置文件中填写猜测的用户名和密码,扫描过程中右侧出现的是扫描日志。

Statistics and Machine Learning Toolbox

Statistics and Machine Learning Toolbox(带书签),MATLAB统计学习工具

Go语言学习笔记之接口interface

go自学

qq_43170570的博客 772

OV9734 DATASHEET,完整规格书

OV9734完整规格书,包括电气参数,尺寸规格,寄存器配置表等

GoLang语言学习笔记(一) 接口Interface

GoLang语言学习笔记 接口Interface 简介 作为面向对象语言的最重要的几个特性之一的

zhuodanhao3100的博客 263

jdk-8u144-linux-x64.tar.gz.

该资源为搭建Linux系统Java环境用,资源的后缀为tar.gz格式的压缩包

GO语言学习笔记(十、接口interface)

接口 interface 接口是一个或多个方法签名的集合 只要某个类型拥有该接口的所有方法签名,即算实现该接口,无需显示声明实现了哪个接口,这称为Strucural Typing 接口只有方法声明,没有实现,没有数据字段 接口可以匿名嵌入其它接口,或嵌入到结构中 将对象赋值给接口时,会发生拷贝,而接口内部存储的是指向这个复制品的指针,既无法修改复制品的状态,也无法获取指针 只有当接口存...

分享AI、区块链技术及应用,未来已来 190

GO语言学习笔记-接口篇 Study for Go ! Chapter six - Interface

持续更新 Go 语言学习进度中 ...... 2023-03-14 GO语言学习笔记 系列部分???? 已完结!! 对于刚刚接触 golang 来说,经过这段时间的学习,对于 GO这门语言已经有了初步的认识。 博主接下来会继续学习 golang 的更多内容,持续更新中...... GO语言学习笔记-类型篇 Study for Go! Chapter one - Type GO语言学习笔记-表达式篇...

Mercury_cc的博客 179

Go语言学习笔记-interface接口✨

接口是一个或多个方法签名的集合,任何类型的方法集中只要拥有与之对应的全部方法, 就表 它 "实现" 了该接 , 必须在该类型上显式添加接口声明。 引用类型。 接口的使用 一、 package main import "fmt" type Mystring string type Finder interface { FindVowels() []rune ...

努力的夏目_41552670 204

(七)Go语言学习笔记 - 接口(interface)

目录1 接口简单使用场景2 什么是接口2.1 details2.2 经典调用接口的实例2.3 接口和继承的关系 1 接口简单使用场景 package main import ( "fmt" ) // 定义一个 Usb 接口 type Usb interface{ Start() Stop() } // 定义手机结构体 type Phone struct{ } // 让Phone实现Us...

RSQ博客 894

Go语言学习笔记(四)结构体struct & 接口Interface & 反射

加 Golang学习 QQ群共同学习进步成家立业工作 ^-^ 群号:96933959 结构体struct struct 用来自定义复杂数据结构,可以包含多个字段(属性),可以嵌套; go中的struct类型理解为类,可以定义方法,和函数定义有些许区别; struct类型是值类型。 struct定义 type User struct { Name string A

linux12a的博客 437

go interface转int_go语言学习笔记(5)- 指针、标识符、运算符

题目演示:写一个程序,获取一个int变量的num的地址,并显示。将num的地址赋给指针ptr,并通过ptr去修改num的值。指针使用细节:(1)值类型,都有对应的指针类型,形式为 数据类型, 比如 int对应的指针类型就是int,那么float32对面的指针类型就是*float32,以此类推。(bool、string、数组和结构体)值类型和引用类型介绍值类型:基本数据类型int系列、float系列...

weixin_39593718的博客 336

go语言学习笔记 — 进阶 — 接口(6):空接口类型interface{} —— 能保存所有值

空接口是接口类型的特殊形式。空接口没有任何方法,因此任何类型都无法实现空接口。 从实现角度看,任何值都满足空接口的需求,因此空接口可以保存任何值,也可以从空接口中取出原值。 注:空接口类似于C语言中的void*,在泛型和模板出现前,空接口是一种非常灵活的数据抽象保存和使用方法。空接口的内部实现保存了对象的类型和指针。使用空接口保存一个数据的过程,会比直接使用对应数据类型的变量保存稍慢,因此在开发中,应在需要的地方使用空接口,而不是所有地方都使用空接口。 1. 把值保存到空接口中 interface{}

yjk13703623757的博客 451

Go语言学习笔记(四)结构体struct & 接口Interface & 反射reflect

加 Golang学习 QQ群共同学习进步成家立业工作 ^-^ 群号:96933959 结构体struct struct 用来自定义复杂数据结构,可以包含多个字段(属性),可以嵌套; go中的struct类型理解为类,可以定义方法,和函数定义有些许区别; struct类型是值类型。 struct定义 type User struct { Name string ...

weixin_30706691的博客 202

go struct 静态函数_Go语言学习笔记(四)结构体struct & 接口Interface & 反射reflect...

加 Golang学习 QQ群共同学习进步成家立业工作 ^-^ 群号:96933959结构体structstruct 用来自定义复杂数据结构,可以包含多个字段(属性),可以嵌套;go中的struct类型理解为类,可以定义方法,和函数定义有些许区别;struct类型是值类型。struct定义type User struct{NamestringAge int32messstring}varuser ...

weixin_39734048的博客 442
上一篇: 考研英语 - word-list-35
下一篇: Go语言学习笔记 --- reflection
Wang's Blog
博客等级 码龄12年 7438粉丝 2422原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Wang's Blog

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值