当前位置: 首页 > 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;为其他对象提供一种代理以…...

“TinyVue Skill:让 AI 真正懂你的组件库” 是 OpenTiny 团队针对 AI 智能体(Agent)开发的一套**技能工具集**

“TinyVue Skill&#xff1a;让 AI 真正懂你的组件库” 是 OpenTiny 团队针对 AI 智能体&#xff08;Agent&#xff09;开发的一套技能工具集。它的核心目标是解决通用大模型在生成 TinyVue 代码时容易出现的“幻觉”问题&#xff08;如 API 记错、版本不兼容&#xff09;&…...

第三节课总结

一、计算机中的单位1、比特位&#xff08;bit&#xff09;&#xff1a;一个比特位只能放一个二进制数据&#xff0c;要么0要么12.字节&#xff08;byte&#xff09;&#xff1a;一个字节 8个比特位1024byte 1KB1024KB 1MB1024MB 1GB1024GB 1T1024TB 1PB3.每一种数据类型都可…...

OpenClaw 大结局——接入个人微信诤

本课概览 Microsoft Agent Framework (MAF) 提供了一套强大的 Workflow&#xff08;工作流&#xff09; 框架&#xff0c;用于编排和协调多个智能体&#xff08;Agent&#xff09;或处理组件的执行流程。 本课将以通俗易懂的方式&#xff0c;帮助你理解 MAF Workflow 的核心概念…...

iMakerPS2:多PS2手柄高可靠通信协议栈

1. 项目概述iMakerPS2 是一款专为嵌入式系统设计的 PlayStation 1/2 控制器通信协议栈&#xff0c;由越南 iMaker 团队重构并持续维护。该库并非简单封装&#xff0c;而是基于对 PS2 协议物理层、时序逻辑与命令帧结构的深度逆向解析所构建的轻量级、高鲁棒性驱动框架。其核心目…...

2026年2月 | 薪酬绩效设计TOP8咨询公司推荐

在企业人效低下、薪酬激励失效、人才流失率攀升的挑战下&#xff0c;科学的薪酬绩效体系成为组织破局的关键。数据显示&#xff0c;超过60%的中小企业面临"高成本、低产出"困境&#xff0c;薪酬结构不合理导致人才流失率居高不下。本文基于"方法论创新、落地执行…...

C# 实现异步非阻塞式定时关闭消息弹窗

1. 为什么需要异步非阻塞式消息弹窗 在日常开发中&#xff0c;MessageBox.Show()可能是我们最先接触到的弹窗方式。但用过几次就会发现&#xff0c;这个看似方便的方法存在两个致命缺陷&#xff1a;一是必须等待用户点击确认按钮&#xff0c;二是会阻塞当前线程的执行。想象一下…...

AD22100K温度传感器嵌入式驱动设计与ADC信号链优化

1. OSS-EC_ADI_AD22100K_00000057 温度传感器驱动库深度解析1.1 器件特性与工程定位OSS-EC_ADI_AD22100K_00000057 是面向 Analog Devices AD22100K 集成温度传感器的嵌入式软件驱动库。该库并非通用型传感器框架&#xff0c;而是针对 AD22100K 独特模拟输出特性的专用适配层&a…...

腾讯云服务器域名绑定实战:从IP到域名的无缝切换

1. 为什么需要将IP地址绑定到域名&#xff1f; 想象一下&#xff0c;你刚在腾讯云上买了一台服务器&#xff0c;兴奋地搭建了自己的个人博客。这时候你发现访问网站只能通过一串数字组成的IP地址&#xff0c;比如123.456.789.123。不仅难记&#xff0c;而且显得很不专业。这就是…...

【AI原生研发融合DevOps终极指南】:20年实战验证的7大融合框架与落地避坑清单

第一章&#xff1a;AI原生软件研发与传统DevOps融合的本质演进 2026奇点智能技术大会(https://ml-summit.org) AI原生软件研发并非对传统DevOps的替代&#xff0c;而是其能力边界的结构性延展——当模型成为一等公民&#xff08;first-class artifact&#xff09;&#xff0c…...

燃料电池热管理控制,接受定制,单循环,双循环定制,效率

代码逻辑分析 数据构建&#xff1a;由于没有原始数据&#xff0c;代码中通过分段函数模拟了图中的趋势&#xff1a; 0-600s&#xff1a;保持为 0。 600-700s&#xff1a;出现一个向下的尖峰&#xff08;约 -0.4&#xff09;&#xff0c;随后迅速反弹至 0.2。 700-1100s&#xf…...