当前位置: 首页 > news >正文

Golang 的面向对象

文章目录

        • duck typing
        • nil不一定是空接口
        • 组合代替继承
        • 接口转换回具体的类型
        • 使用switch匹配接口的原始类型

duck typing

golang中实现某个接口不需要像其它语言使用 implemet 去继承实现,而是只要你的结构体包含接口所需的方法即可

package mainimport "fmt"type Person interface {talk()
}type XM struct {
}func (receiver XM) talk() {fmt.Println("I am XM")
}func main() {var p Personp = XM{}p.talk() // I am XM
}

nil不一定是空接口

初始化的接口是等于 nil的,接口底层其实有一个type来记录原始的struct,当某个struct赋值给接口时,接口会在type中记录该类型(就算是nil也会记录),此时接口打印出来是nil,但和nil并不相等

}type XM struct {
}func (X XM) talk() {fmt.Println("I am XM")
}func main() {var p Personif p == nil {fmt.Println("var p Person is nil") //var p Person is nil}var a *XMif a == nil {fmt.Println("var a *XM is nil") //var a *XM is nil}p = aif p != nil {fmt.Println("var p != nil") //var p != nil}fmt.Println(p) // <nil>
}

组合代替继承

通过内嵌组合来继承功能,XM匿名内嵌了Person,就具有了Person的能力

package mainimport "fmt"type Person struct {Name string
}func (receiver Person) Talk() {fmt.Printf("I am %s \n", receiver.Name)
}type XM struct {Person
}func main() {var xm XMp := Person{Name: "Person"}xm.Name = "XM"xm.Talk() // I am XMp.Talk()  // I am Person
}

重写方法只需要声明一个同名方法即可

package mainimport "fmt"type Person struct {Name string
}func (receiver Person) Talk() {fmt.Printf("I am %s \n", receiver.Name)
}type XM struct {Person
}func (receiver XM) Talk() {fmt.Printf("hello,I am %s", receiver.Name)
}func main() {var xm XMxm.Name = "XM"xm.Talk() // hello,I am XM
}

接口转换回具体的类型

struct 转为接口,只要struct 拥有 接口的方法,即可将struct 赋值给接口,如果想将接口转回struct,可以使用 result,ok := interface.(struct), ok 代表是否能够成功转换

package mainimport "fmt"type IAnimal interface {Eat()
}type Bridge struct {
}func (b Bridge) Eat() {fmt.Println("I can eat")
}func (b Bridge) Fly() {fmt.Println("I can fly")
}type Fish struct {
}func (f Fish) Eat() {fmt.Println("I can eat")
}func ShowTime(animal IAnimal) {animal.Eat()if b, ok := animal.(Bridge); ok {b.Fly()}
}func main() {var (f Fishb Bridge)ShowTime(f) // I can eatfmt.Println("--------------")ShowTime(b) // I can eat \n I can fly
}

ok 判断的是完全转换,就算不ok,转换后的结果也可以调用struct的方法,但是不建议这么做

package mainimport "fmt"type IAnimal interface {Eat()
}type Bridge struct {Name string
}func (b Bridge) Eat() {fmt.Println(b.Name + "I can eat")
}func (b Bridge) Fly() {fmt.Println(b.Name + "I can fly")
}type Fish struct {Name string
}func (f Fish) Eat() {fmt.Println(f.Name + "I can eat")
}func ShowTime(animal IAnimal) {animal.Eat()b, ok := animal.(Bridge)fmt.Println(ok)b.Fly()
}func main() {f := Fish{Name: "fish"}b := Bridge{Name: "bridge"}ShowTime(f)// fishI can eat// false// I can flyfmt.Println("--------------")ShowTime(b)//bridgeI can eat// true//bridgeI can fly
}

使用switch匹配接口的原始类型

struct.(type) 可以获取接口的原始类型,但是只能在switch中使用

package mainimport "fmt"type IAnimal interface {Eat()
}type Bridge struct {Name string
}func (b Bridge) Eat() {fmt.Println(b.Name + "I can eat")
}func (b Bridge) Fly() {fmt.Println(b.Name + "I can fly")
}type Fish struct {Name string
}func (f Fish) Eat() {fmt.Println(f.Name + "I can eat")
}func ShowTime(animal IAnimal) {switch animal.(type) {case Fish:fmt.Println("原先是Fish")case Bridge:fmt.Println("原先是Bridge")}
}func main() {var (f Fishb Bridge)ShowTime(f) // 原先是FishShowTime(b) // 原先是Bridge
}

相关文章:

Golang 的面向对象

文章目录 duck typingnil不一定是空接口组合代替继承接口转换回具体的类型使用switch匹配接口的原始类型 duck typing golang中实现某个接口不需要像其它语言使用 implemet 去继承实现&#xff0c;而是只要你的结构体包含接口所需的方法即可 package mainimport "fmt&qu…...

STABLE DIFFUSION模型及插件的存放路径

记录下学习SD的一些心得&#xff0c;使用的是秋叶大佬的集成webui&#xff0c;下载了之后点击启动器即可开启&#xff0c;文件夹中的内容如下 主模型存放在models文件下的stable-diffusion文件夹内&#xff0c;一些扩展类的插件是存放在extensions文件夹下...

Three.js 设置模型材质纹理贴图和修改材质颜色,材质透明度,材质网格

相关API的使用&#xff1a; 1 traverse &#xff08;模型循环遍历方法&#xff09; 2. THREE.TextureLoader&#xff08;用于加载和处理图片纹理&#xff09; 3. THREE.MeshLambertMaterial&#xff08;用于创建材质&#xff09; 4. getObjectByProperty&#xff08;通过材…...

docker 安装mongodb 虚拟机安装mongodb

生产环境直接安装比较好&#xff0c;以及使用集群环境&#xff0c;本文仅测试交流使用&#xff0c;我用来写分布式im测试使用&#xff1a; nami-im: 分布式im, 集群 zookeeper netty kafka nacos rpc主要为gate&#xff08;长连接服务&#xff09; logic &#xff08;业务&…...

在SockJS+Spring Websocket中convertAndSendToUser中的“用户”来自哪里?

目录 一、前言二、Principal三、使用 一、前言 我们知道可以使用客户端订阅的主题前缀从 stomp 服务器向客户端发送消息&#xff0c;例如 /topic/hello。我们还知道我们可以向特定用户发送消息&#xff0c;因为 spring 提供了convertAndSendToUser(username, destination, mes…...

【软件测试】我的2023面试经验谈

最近行业里有个苦涩的笑话&#xff1a;公司扛过了之前的三年&#xff0c;没扛过摘下最近的一年&#xff0c;真是让人想笑又笑不出来。年前听说政策的变化&#xff0c;大家都满怀希望觉得年后行情一片大好&#xff0c;工作岗位激增&#xff0c;至少能有更多的机会拥抱未来。然而…...

SpringBoot 整合JDBC

SpringData简介 Sping Data 官网&#xff1a;https://spring.io/projects/spring-data数据库相关的启动器 &#xff1a;可以参考官方文档&#xff1a;https://docs.spring.io/spring-boot/docs/2.6.5/reference/htmlsingle/#using-boot-starter 整合JDBC 创建测试项目测试数据…...

TypeScript使用npm安装报错问题

问题如图&#xff1a; 问题原因&#xff1a; 权限不足导致&#xff0c;可以输入如下命令&#xff1a; sudo npm install i -g typescript该命令会要求输入登录密码相关&#xff0c;稍等片刻&#xff0c;即可安装成功。检测安装的命令&#xff1a; tsc -v...

2023国赛数学建模思路 - 复盘:人力资源安排的最优化模型

文章目录 0 赛题思路1 描述2 问题概括3 建模过程3.1 边界说明3.2 符号约定3.3 分析3.4 模型建立3.5 模型求解 4 模型评价与推广5 实现代码 建模资料 0 赛题思路 &#xff08;赛题出来以后第一时间在CSDN分享&#xff09; https://blog.csdn.net/dc_sinor?typeblog 1 描述 …...

学习pytorch 3 tensorboard的使用

tensorboard的使用 1. 安装2. add_scalar 查看函数图形3. 查看结果4. add_image() 查看训练步骤中间结果的图片 1. 安装 pytorch conda环境 pip install tensorboard pip install opencv-python2. add_scalar 查看函数图形 常用来查看 train val loss等函数图形 from torch…...

Linux 命令篇

一、启动网络命令 ip addr 查看网卡信息 service network start 启动网卡 service network stop 关闭网卡 service network restart 重启网络 二、pwd 命令 查看当前目录的路径 linux 下所有的绝对路径都是从根目录 "/" 开始 root:是linux下root用户的根目…...

OpenCV-SIFT算法详解

系列文章目录 文章目录 系列文章目录引言一、高斯金字塔二、高斯差分金字塔三、特征点处理四、特征点描述子总结 引言 SIFT算法是为了解决图片的匹配问题&#xff0c;想要从图像中提取一种对图像的大小和旋转变化保持鲁棒的特征&#xff0c;从而实现匹配。这一算法的灵感也十分…...

Java中的接口到底是什么?

要说Java的【接口】&#xff0c;可以将其类比为现实生活中的一种约定或规范。在Java中&#xff0c;接口定义了一组方法的集合&#xff0c;但没有提供这些方法的具体实现。 你可以将接口看作是一个合同&#xff0c;它规定了一个类必须实现的一组方法。这些方法描述了类所需具备…...

Jpa与Druid线程池及Spring Boot整合(一): spring-boot-starter-data-jpa 搭建持久层

Jpa与Druid线程池及Spring Boot整合(一) Jpa与Druid线程池及Spring Boot整合(二)&#xff1a;几个坑 附录官网文档&#xff1a;core.domain-events域事件 (一)Jpa与Druid连接池及Spring Boot整合作为持久层,遇到系列问题,下面一 一记录&#xff1a; pom.xml 文件中加入必须的…...

helm部署vmalert

先决条件 安装以下软件包&#xff1a;git, kubectl, helm, helm-docs&#xff0c;请参阅本教程。 在 CentOS 上启用 snap 并安装 helm 启用 snapd 使用以下命令将 EPEL 存储库添加到您的系统中&#xff1a; sudo yum install epel-release 按如下方式安装 Snap&#xff1…...

加工厂数字孪生3D可视化展示系统重塑管理模式

近年来“数字化转型”成立各行业聚焦的发展方向&#xff0c;在工业制造领域&#xff0c;智慧工业数字孪生可视化平台作为一种新型的技术手段&#xff0c;或将成为助力企业跑赢数字化转型最后一公里。 提高生产效率 传统的生产方式往往需要大量的人工干预&#xff0c;不仅耗时耗…...

php从静态资源到动态内容

1、从HTML到PHP demo.php:后缀由html直接改为php,实际上当前页面已经变成了动态的php应用程序脚本 demo.php: 允许通过<?php ... ?>标签,添加php代码到当前脚本中 php标签内部代码由php.exe解释, php标签之外的代码原样输出,仍由web服务器解析 <!DOCTYPE html>…...

JavaScript:模块化【CommonJS与ES6】

在 JavaScript 编程中&#xff0c;随着项目的复杂性增加&#xff0c;代码的组织和管理变得至关重要。模块化是一种强大的编程概念&#xff0c;它允许我们将代码划分为独立的模块&#xff0c;提高了可维护性和可扩展性。本文将详细介绍 CommonJS 和 ES6 模块&#xff0c;帮助你理…...

Redis—持久化

这里写目录标题 AOF三种写回策略写回策略的优缺点AOF 重写机制AOF后台重写AOF优缺点使用命令 RDBRDB 持久化的工作原理执行快照时&#xff0c;数据能被修改吗RDB 持久化的优点RDB 持久化的缺点 混合持久化大key对持久化的影响 AOF 保存写操作命令到日志的持久化方式&#xff0…...

【设计模式】代理模式

在代理模式&#xff08;Proxy Pattern&#xff09;中&#xff0c;一个类代表另一个类的功能。这种类型的设计模式属于结构型模式。 在代理模式中&#xff0c;我们创建具有现有对象的对象&#xff0c;以便向外界提供功能接口。 介绍 意图&#xff1a;为其他对象提供一种代理以…...

变量 varablie 声明- Rust 变量 let mut 声明与 C/C++ 变量声明对比分析

一、变量声明设计&#xff1a;let 与 mut 的哲学解析 Rust 采用 let 声明变量并通过 mut 显式标记可变性&#xff0c;这种设计体现了语言的核心哲学。以下是深度解析&#xff1a; 1.1 设计理念剖析 安全优先原则&#xff1a;默认不可变强制开发者明确声明意图 let x 5; …...

第19节 Node.js Express 框架

Express 是一个为Node.js设计的web开发框架&#xff0c;它基于nodejs平台。 Express 简介 Express是一个简洁而灵活的node.js Web应用框架, 提供了一系列强大特性帮助你创建各种Web应用&#xff0c;和丰富的HTTP工具。 使用Express可以快速地搭建一个完整功能的网站。 Expre…...

Oracle查询表空间大小

1 查询数据库中所有的表空间以及表空间所占空间的大小 SELECTtablespace_name,sum( bytes ) / 1024 / 1024 FROMdba_data_files GROUP BYtablespace_name; 2 Oracle查询表空间大小及每个表所占空间的大小 SELECTtablespace_name,file_id,file_name,round( bytes / ( 1024 …...

质量体系的重要

质量体系是为确保产品、服务或过程质量满足规定要求&#xff0c;由相互关联的要素构成的有机整体。其核心内容可归纳为以下五个方面&#xff1a; &#x1f3db;️ 一、组织架构与职责 质量体系明确组织内各部门、岗位的职责与权限&#xff0c;形成层级清晰的管理网络&#xf…...

第25节 Node.js 断言测试

Node.js的assert模块主要用于编写程序的单元测试时使用&#xff0c;通过断言可以提早发现和排查出错误。 稳定性: 5 - 锁定 这个模块可用于应用的单元测试&#xff0c;通过 require(assert) 可以使用这个模块。 assert.fail(actual, expected, message, operator) 使用参数…...

微信小程序云开发平台MySQL的连接方式

注&#xff1a;微信小程序云开发平台指的是腾讯云开发 先给结论&#xff1a;微信小程序云开发平台的MySQL&#xff0c;无法通过获取数据库连接信息的方式进行连接&#xff0c;连接只能通过云开发的SDK连接&#xff0c;具体要参考官方文档&#xff1a; 为什么&#xff1f; 因为…...

IT供电系统绝缘监测及故障定位解决方案

随着新能源的快速发展&#xff0c;光伏电站、储能系统及充电设备已广泛应用于现代能源网络。在光伏领域&#xff0c;IT供电系统凭借其持续供电性好、安全性高等优势成为光伏首选&#xff0c;但在长期运行中&#xff0c;例如老化、潮湿、隐裂、机械损伤等问题会影响光伏板绝缘层…...

华为云Flexus+DeepSeek征文|DeepSeek-V3/R1 商用服务开通全流程与本地部署搭建

华为云FlexusDeepSeek征文&#xff5c;DeepSeek-V3/R1 商用服务开通全流程与本地部署搭建 前言 如今大模型其性能出色&#xff0c;华为云 ModelArts Studio_MaaS大模型即服务平台华为云内置了大模型&#xff0c;能助力我们轻松驾驭 DeepSeek-V3/R1&#xff0c;本文中将分享如何…...

精益数据分析(97/126):邮件营销与用户参与度的关键指标优化指南

精益数据分析&#xff08;97/126&#xff09;&#xff1a;邮件营销与用户参与度的关键指标优化指南 在数字化营销时代&#xff0c;邮件列表效度、用户参与度和网站性能等指标往往决定着创业公司的增长成败。今天&#xff0c;我们将深入解析邮件打开率、网站可用性、页面参与时…...

JavaScript基础-API 和 Web API

在学习JavaScript的过程中&#xff0c;理解API&#xff08;应用程序接口&#xff09;和Web API的概念及其应用是非常重要的。这些工具极大地扩展了JavaScript的功能&#xff0c;使得开发者能够创建出功能丰富、交互性强的Web应用程序。本文将深入探讨JavaScript中的API与Web AP…...