day09 接口

news/2024/7/4 9:13:53/文章来源:https://www.cnblogs.com/dengz/p/18279123

什么是接口

  • 即:将一些共性方法集合在一起
  • 方法的集合,不需要方法的具体内容
package mainimport "fmt"// 定义接口 使用 interface. 结合 struct 结构体使用
type USB interface {input()  // 输入 方法output() // 输出 方法
}
type Mouse struct {name string
}type KeyBord struct {name string
}// 实现 接口的全部方法,就代表实现类这个接口
func (m Mouse) input() {fmt.Println(m.name, "鼠标输入")}
func (m Mouse) output() {fmt.Println(m.name, "鼠标输出")}
func (k KeyBord) input() {fmt.Println(k.name, "键盘输入")}
func (k KeyBord) output() {fmt.Println(k.name, "键盘输入")}func realizeUsb(usb USB) {usb.input()usb.output()
}func main() {/*go中的接口- 什么是接口? 即:将一些共性方法集合在一起- 接口是:方法的集合,不需要方法的具体内容*/// 通过传入`接口` 来实现调用mouse := Mouse{name: "罗技"}// realizeUsb 的参数 是接口类型,如果一个结构体实现这个接口的所有方法,则结构体就是接口类型realizeUsb(mouse)keyboard := KeyBord{name: "镭射"}realizeUsb(keyboard)// 定义高级类型var usb USBusb = mouse// 只能调用usb接口中的方法,不能调用 mouse 结构体中的属性// usb.name // usb.name undefined (type USB has no field or method name)usb.input()}

go 空接口

  • 所有结构体都实现类空接口个,空接口可以存储任何类型
  • interface {} == any
package mainimport "fmt"// 定义空接口,实现包容万物
type EmptyInterface interface {
}type DogEmptyStruct struct {name string
}// 定义空接口实现方法
func emptyInterfaceFunc(ei EmptyInterface) {fmt.Printf("空接口实现函数。【参数:%v  ----  类型:%T】\n", ei, ei) // main.DogEmptyStruct
}// 万能接口. 空接口作为函数的参数// main.DogEmptyStruct
func emptyInterfaceFunc2(universalInterface interface{}) {fmt.Printf("万能接口。【参数:%v  ----  类型:%T】\n", universalInterface, universalInterface)}
func main() {/*空接口*/// 所有结构体都实现类空接口个,空接口可以存储任何类型// interface {} == anyvar dogEmpty = DogEmptyStruct{name: "小鸡毛"}emptyInterfaceFunc(dogEmpty)fmt.Println("-----")//var a1 EmptyInterface = DogEmptyStruct{name: "小鸡毛"}fmt.Printf("a1 【参数:%v  ----  类型:%T】\n", a1, a1) // 【参数:{小鸡毛}  ----  类型:main.DogEmptyStruct】var a2 EmptyInterface = 1fmt.Printf("a2 【参数:%v  ----  类型:%T】\n", a2, a2) // 【参数:1  ----  类型:int】var a3 EmptyInterface = "string"fmt.Printf("a3 【参数:%v  ----  类型:%T】\n", a3, a3) // 【a3 【参数:string  ----  类型:string】fmt.Println(a1, a2, a3)fmt.Println("万能参数,空接口-----")emptyInterfaceFunc2(1)emptyInterfaceFunc2("string")emptyInterfaceFunc2(make([]string, 10))fmt.Println("空接口对map和slice的使用-----")map1 := make(map[string]interface{})map2 := make(map[string]any)fmt.Printf("map1 【类型:%T】\n", map1) // 【类型:map[string]interface {}】fmt.Printf("map2 【类型:%T】\n", map2) // 【类型:map[string]interface {}】// 空接口能 接收任何类型的参数map1["a1"] = a1map1["a2"] = a2map1["a3"] = a3fmt.Println(map1) // map[a1:{小鸡毛} a2:1 a3:string]}

接口类型

package mainimport "fmt"type MyStruct struct {code int
}type MyInterface interface {myInterfaceFunc()
}func (msc *MyStruct) myInterfaceFunc() interface{} {return interface{}(msc.code)
}
func test(msc MyStruct) {ret := msc.myInterfaceFunc()fmt.Printf("类型:%T\n", ret)fmt.Printf("内存地址:%p\n", &ret)
}func main() {ms1 := MyStruct{code: 1}test(ms1)ms2 := MyStruct{code: 2}test(ms2)var any interface{}fmt.Printf("any类型:%T\n", any)fmt.Printf("any内存地址:%p\n", &any)any2 := anyany3 := anyfmt.Printf("any2类型:%T\n", any2)fmt.Printf("any2内存地址:%p\n", &any2)fmt.Printf("any3内存地址:%p\n", &any3)any = 42// 动态类型断言if val, ok := any.(int); ok {fmt.Println("Value is an integer:", val)} else {fmt.Println("Value is not an integer")}
}

接口嵌套

package mainimport "fmt"type AA interface {test1()
}type BB interface {test2()
}// 定义接口CC : 如果实现CC接口,需要实现test1()/test2()/test3() 三个方法
type CC interface {// 嵌套 接口AA // 导入AA接口中的方法BBtest3()
}// 编写一个结构体 , 实现CC
type Dog7 struct {
}// 函数+结构体参数+接口中定义的函数名
func (d Dog7) test1() {fmt.Println("test1")
}
func (d Dog7) test2() {fmt.Println("test2")}
func (d Dog7) test3() {fmt.Println("test3")}
func main() {/* 接口的嵌套 */// 结构体实例化对象,调用接口 AA / BB / CC 三个方法var dog Dog7 = Dog7{}dog.test1()dog.test2()dog.test3()// 因为CC接口嵌套了 AA 和 BB 接口。可以定义 某个变量的类型为接口类型。将结构体对象赋值给 这个变量。这个变量就能实现 test1/test2/test3 三个方法var c CC = Dog7{} // 向上转型后只能调用自己的方法c.test3()c.test2()c.test1()// 因为CC接口嵌套了 AA 和 BB 接口。可以定义 某个变量的类型为接口类型。将结构体对象赋值给 这个变量。这个变量就能实现 test1/test2/test3 三个方法var a AA = Dog7{}//a.test3() // 向上转型后只能调用自己的方法//a.test2() // 向上转型后只能调用自己的方法a.test1()}

接口断言

  • 定义:检查一个接口的变量是不是符合预期调用/值
  • 被断言的对象必须是接口型。否则会报错
  • 格式: t,ok:=i.(T) 【t:就是i接口是T类型的,i:接口,T:类型】
package mainimport "fmt"func main() {/*接口断言- 定义:检查一个接口的变量是不是符合预期调用/值- 被断言的对象必须是接口型。否则会报错- 格式: t,ok:=i.(T) 【t:就是i接口是T类型的,i:接口,T:类型】*/assertString("123") // 断言成功,则无异常//assertString(123)   // 断言失败就会抛出异常,停止程序【panic: interface conversion: interface {} is int, not string 】assertInt("1")assertInt(true)assertInt(1)
}// 判断一个变量是不是字符串类型
func assertString(i interface{}) {s := i.(string)fmt.Println(s)
}// 断言失败不希望程序停止
func assertInt(i any) {i, ok := i.(int)fmt.Println(i, ok)if ok {fmt.Println("int类型")} else {fmt.Println("非int类型")}
}

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

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

相关文章

Maven 笔记

开发工具:Maven相关内容笔记# Maven简介 Maven的本质是一个项目管理工具,将项目开发和管理过程抽象成一个项目对象模型(POM)) 这玩意儿是使用Java开发的,所以采用的就是Java的思想:面向对象 POM (Project Object Model):项目对象模型Maven的作用:项目构建:提供标准的、…

202406月度小结

这个学期比上个学期有意思得多了。但是为什么我只写了6月小结,没有写3月4月5月小结呢?因为那时候还没有想到用博客写这种小结形式的随笔啦…… 横向对比,这四个月都挺有意思的。但是由于我太容易忘记事情了……我的记忆是有限的,先把6月发生的趣事赶紧记录下来比较好。 昨天…

大模型技术方向Task1笔记

赛题概要 一、赛事背景 在当今数字化时代,企业积累了丰富的对话数据,这些数据不仅是客户与企业之间交流的记录,更是隐藏着宝贵信息的宝库。在这个背景下,群聊对话分角色要素提取成为了企业营销和服务的一项重要策略。 群聊对话分角色要素提取的理念是基于企业对话数据的深度…

[LeetCode] 122. Best Time to Buy and Sell Stock II

medium是你的谎言. class Solution:def maxProfit(self, prices: List[int]) -> int:#1if len(prices) == 1:return 0#elsemax_profit = 0min_price = prices[0]for i, element in enumerate(prices):#find a min_price if element <= min_price:min_price = elementelse…

【esp32 学习笔记】esp-idf学会调用组件管理——以button

简单不看版——esp-idf组件管理步骤 在ESP-IDF 组件管理器网页(https://components.espressif.com/)搜索我们需要的组件,比如【button】,然后 点开相应的组件,比如 espressif/button 组件。 【关键步骤】复制相关组件界面上配置组件的命令 ,形如:idf.py add-dependency &…

idea创建javaweb项目

1.新建project项目 2.添加依赖<dependencies> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-webmvc</artifactId> <version>6.0.10</version> </dependency>…

Linguistics-English-Would, Should, and Could: How to Use Them Correctly

https://7esl.com/would-should-could/ Key Takeaways“Would” is used for hypotheticals and future possibilities that may not occur. “Should” implies advice, expectation, or probability. “Could” expresses past ability or present possibility.Home Knowled…

[LeetCode] 121. Best Time to Buy and Sell Stock

想清楚了确实算是简单题. class Solution:def maxProfit(self, prices: List[int]) -> int:#1if len(prices) == 1:return 0#elsemax_profit = 0min_price = prices[0]for i, element in enumerate(prices):if element <= min_price:min_price = elementelif element - m…

Druid数据库加密实现

Druid数据库连接池中的密码加密功能提供了以下几个主要好处: 增强安全性:最显著的好处是提高了数据库系统的安全性。明文存储数据库密码容易造成安全隐患,一旦配置文件泄露,数据库可能遭受未授权访问。通过加密数据库密码,即使配置文件落入未经授权的人员手中,他们也无法…

17-移动端适配

移动端适配01 单位的分类02 相对单位相对的对象 2.1 em 永远都是相对于自身的font-size <!DOCTYPE html> <html lang="en"> <head><meta charset="UTF-8"><meta name="viewport" content="width=device-width, …

maven下载安装配置

Maven 是一款为 Java 项目管理构建、依赖管理的工具(软件),使用 Maven 可以自动化构建、测试、打包和发布项目,大大提高了开发效率和质量。 Maven的两大核心作用: 1.依赖管理: Maven 可以管理项目的依赖,包括自动下载所需依赖库、自动下载依赖需要的依赖并且保证版本没有…

回溯

理论基础 什么是回溯法回溯法也可以叫做回溯搜索法,它是一种搜索的方式。 在二叉树系列中,我们已经不止一次,提到了回溯,例如二叉树:以为使用了递归,其实还隐藏着回溯 (opens new window)。 回溯是递归的副产品,只要有递归就会有回溯。 所以以下讲解中,回溯函数也就是递…

day02 go的数据类型和运算符

day02 go的数据类型和运算符 前言动态语言类型 自动开辟数据空间,自动识别数据类型 python 静态语言类型 开辟内存空间,定义数据类型 c,java,gogo 语言中的数据类型 /*- go 基本数据类型:- 布尔类型- 数值类型- 整型 :- 有符号:int,int8,int16,int32,int64.- 无符号:ui…

16-视口的理解

视口的理解01 布局视口和视觉视口02 理想视口<meta name="viewport" content="width=device-width, initial-scale=1.0"> 通过width=device-width 即布局视口的宽度等于设备的宽度,以此来达到效果视口中的其它值

《痞子衡嵌入式半月刊》 第 103 期

痞子衡嵌入式半月刊: 第 103 期这里分享嵌入式领域有用有趣的项目/工具以及一些热点新闻,农历年分二十四节气,希望在每个交节之日准时发布一期。 本期刊是开源项目(GitHub: JayHeng/pzh-mcu-bi-weekly),欢迎提交 issue,投稿或推荐你知道的嵌入式那些事儿。 上期回顾 :《…

EasyDesktop 浏览器书签管理从未如此简单

作为一名软件开发从业人员, 每天80%的时间都在与浏览器打交道, 一半的时间在用浏览器开发调试, 另一半时间则是在互联网上搜寻各种知识和资源. 为此, 我的浏览器书签栏存储和很多非常棒的链接, 多到2k屏幕分辨率下一栏都放不下, 为此我只好把这些书签的名称改的短一点, 这样就能…

docker基本介绍

虚拟机的部署形式 一个物理机可以部署多个app 每个app独立运行在一个VM虚拟机里面 依然部署很慢 迁移和扩展可以使用VM的克隆 每一个虚拟机都是一个完整的操作系统,虚拟机多的时候,操作系统本身资源也就被消耗过多 企业使用的虚拟化工具为:vmware esxi虚拟化工具 个人学习使…

新生题

MISC kongfu 用winhex打开压缩包,下拉到最后发现keybase64解密后发现是栅栏密码audio 打开发现是一个wav文件,用Audacity打开根据电平,得到01100010 01100001 01101011 01100100 01101111 01110010 二进制转字符进行md5加密Smtpbase64解码foremost 用foremost分解图片分解成…

STM32串口如何输出中文

当你想在串口调试助手实现换行功能时却不行时,试一试将\n改为\r\n 因为我用的是XCOM串口调试助手,就遇到了这样的问题 而当你加入int fputc(int ch, FILE *f)函数却实现不了printf,putchar调用时 需要加入#include<stdio.h>并勾选魔术棒中的Use MicroLIBint fputc(int…

DApp设计与开发 课程笔记(四):NFT交易市场合约

笔记对应课程内容为成都信息工程大学区块链产业学院老师梁培利的DApp 设计与开发 10-13 课 笔记中提到的名词不做过多解释 不懂就搜!开发准备:编辑IDE环境:Vscode+Hardhat 调试:Remix ERC标准智能合约生成巫师:https://docs.openzeppelin.com/contracts/5.x/wizard动手学 …