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

# Go 语言中的 Interface 和 Struct


```go
package mainimport ("fmt"
)// Girl 是一个接口,定义了所有"女性"类型都应该实现的方法
type Girl interface {call()introduce()
}// Wife 结构体代表妻子
type wife struct {name       stringage        intyearsWed   int
}// call 方法的 wife 实现
func (w wife) call() {fmt.Println("I am wife, I can call you!")
}// introduce 方法的 wife 实现
func (w wife) introduce() {fmt.Printf("Hello, I'm %s, %d years old, and we've been married for %d years.\n", w.name, w.age, w.yearsWed)
}// Girlfriend 结构体代表女朋友
type girlfriend struct {name           stringage            intmonthsDating   int
}// call 方法的 girlfriend 实现
func (g girlfriend) call() {fmt.Println("I am girlfriend, I can call you!")
}// introduce 方法的 girlfriend 实现
func (g girlfriend) introduce() {fmt.Printf("Hi, I'm %s, %d years old, and we've been dating for %d months.\n", g.name, g.age, g.monthsDating)
}func main() {// 声明一个 Girl 接口类型的变量var partner Girl// 创建一个 wife 实例并赋值给 partnerpartner = wife{name: "Alice", age: 30, yearsWed: 5}// 调用 wife 的方法partner.call()partner.introduce()// 创建一个 girlfriend 实例并赋值给 partnerpartner = girlfriend{name: "Bob", age: 25, monthsDating: 6}// 调用 girlfriend 的方法partner.call()partner.introduce()
}

返回结果:
I am wife, I can call you!
Hello, I’m Alice, 30 years old, and we’ve been married for 5 years.
I am girlfriend, I can call you!
Hi, I’m Bob, 25 years old, and we’ve been dating for 6 months.

Go 语言中的 Interface 和 Struct

引言

Go 语言以其简洁而强大的特性而闻名,其中 interface 和 struct 是两个核心概念。本文将通过一个简单的例子来解释这两个概念的使用和重要性。

Struct(结构体)

定义和用途

在 Go 中,struct 用于创建自定义类型,类似于其他语言中的类。

示例代码

type wife struct {// 这里可以添加 wife 的特定属性
}type girlfriend struct {// 这里可以添加 girlfriend 的特定属性
}

解释

  • wifegirlfriend 是两个不同的 struct。
  • 它们可以包含各自的属性,尽管在这个例子中没有定义具体的属性。

Interface(接口)

定义和用途

Interface 在 Go 中定义了一组方法签名,任何类型只要实现了这些方法,就被认为实现了该接口。

示例代码

type Wife interface {call()
}

解释

  • Wife 接口定义了一个 call() 方法。
  • 任何实现了 call() 方法的类型都被视为实现了 Wife 接口。

方法实现

为 Struct 实现方法

在 Go 中,我们可以为 struct 定义方法,使其实现接口。

示例代码

func (w wife) call() {fmt.Println("I am wife, I can call you!")
}func (g girlfriend) call() {fmt.Println("I am girlfriend, I can call you!")
}

解释

  • 这两个方法使 wifegirlfriend 结构体都实现了 Wife 接口。
  • 每个结构体有自己的 call() 方法实现。

多态性

使用接口实现多态

Go 通过接口实现多态,允许不同类型的对象对同一消息做出响应。

示例代码

func main() {var partner Wifepartner = new(wife)partner.call()partner = new(girlfriend)partner.call()
}

解释

  • partner 变量的类型是 Wife 接口。
  • 它可以存储任何实现了 Wife 接口的类型的值。
  • 根据 partner 实际引用的对象,call() 方法会有不同的行为。

总结

通过这个简单的例子,我们可以看到:

  1. Struct 用于定义自定义类型。
  2. Interface 定义了一组方法签名。
  3. 通过为 struct 实现方法,可以使其满足接口的要求。
  4. 接口允许不同类型的对象以多态的方式被处理。

这种设计使得 Go 语言在保持简洁的同时,提供了强大的面向对象编程能力。

相关文章:

# Go 语言中的 Interface 和 Struct

go package mainimport ("fmt" )// Girl 是一个接口,定义了所有"女性"类型都应该实现的方法 type Girl interface {call()introduce() }// Wife 结构体代表妻子 type wife struct {name stringage intyearsWed int }// call 方法…...

SSM与Springboot是什么关系? -----区别与联系

SSM(Spring Spring MVC MyBatis)和 Spring Boot 都是基于 Spring 框架的技术栈,但它们在使用方式、配置复杂度以及设计理念上有所不同。下面是 SSM 和 Spring Boot 之间的关系及主要区别: SSM (Spring Spring MVC MyBatis) 定…...

MATLAB小波变换图像融合系统

二、应用背景及意义 本课题利用小波变换进行图像的融合,然后对融合的结果进行图像质量的评价。所谓小波变换图像融合就是对多个的信息目标进行一系列的图像提取和合成,进而可以获得对同一个信息目标的更为精确、全面、可靠的高低频图像信息描述。并且也…...

nginx-安装和80端口映射多域名和ssl

一、安装所需插件 1、安装 gcc gcc是linux下的编译器,它可以编译 C,C,Ada,Object C和Java等语言。 yum -y install gcc 2、安装pcre、pcre-devel pcre是一个perl库,包括perl兼容的正则表达式库,nginx的http模块使用pcre来解析 正则表达式。…...

SVN小乌龟 create patch 和 apply patch 功能

在SVN(Subversion)版本控制系统中,使用“小乌龟”(TortoiseSVN)这个图形界面工具可以极大地简化SVN操作。TortoiseSVN中的“create patch”和“apply patch”是两个非常有用的功能,它们与版本控制中的补丁&…...

#MySQL `SELECT` 语句执行流程详解

在数据库操作中,MySQL 的 SELECT 语句是用于查询数据最常见的 SQL 语句之一。理解它的执行流程对数据库优化和性能提升具有至关重要的意义。本文将详细解析 SELECT 语句从发出请求到返回结果的每个步骤,并结合 MySQL 的架构为您提供深度理解。 ## 1. 连接…...

docker容器运行一段时间提示Failed to initialize NVML: Unknown Error

情况描述 服务器使用docker启动容器。启动以后一切正常也能跑程序。但是,在运行一段时间(2天左右不等),会发现gpu掉了。输入nvidia-smi提示 Failed to initialize NVML: Unknown Error 主要发生条件是,docker启动的…...

PPT自动化:快速更换PPT图片(如何保留原图片样式等参数更换图片)

文章目录 📖 介绍 📖🏡 演示环境 🏡📒 PPT更换图片 📒1. 安装 `python-pptx` 模块2. 加载PPT文件3. 查找并替换图片3.1 查找图片形状3.2 获取原图片的样式和位置3.3 替换图片4. 保存修改后的PPT文件5. 设置图片的相关参数5.1 设置透明度5.2 设置边框🚀 保留所有参…...

秒懂MVC, MVP, MVVM框架

框架的目标 关注点分离 (separation of concerns)低耦合 (Loose coupling)容易维护 (Maintainable)容易被测试 (Testable)...

IDEA社区版如何用tomcat运行war包

前言 我们在使用IDEA开发Java应用时,有时候需要运行的不是jar包,而是war包,但IDEA社区版默认是不支持tomcat容器的,无法直接运行war包。不过好在我们有一个强大的插件来支持我们使用tomcat,那么,我们应该如…...

如何使用 Git Cherry-Pick 和 Reset 处理误提交,并确保安全回滚

在开发过程中,偶尔会遇到不小心将功能开发提交到错误分支上的情况。假设我们计划在 10 月 24 号上线某些功能,但却不小心在 10 月 17 号的上线分支上进行了开发。为了解决这个问题并将误提交的内容移到正确的分支上,我们可以借助 Git 的一些功…...

Goland 搭建Gin脚手架

一、使用编辑器goland 搭建gin 打开编辑器 新建项目后 点击 create 二、获得Gin框架的代码 命令行安装 go get -u github.com/gin-gonic/gin 如果安装不上,配置一下环境 下载完成 官网git上下载 这样就下载完成了。、 不过这种方法需要设置一下GOPATH 然后再执…...

Java Spring的高级装配

1.profile与bean 1.1 profile 如果我们在配置类中装配一个bean,但是这个bean与环境相关怎么办? 比如有一个类,它在开发环境采取一种模式,但是到了生产环境,有需要使用另一种环境。 当然,你可能会说&…...

分布式光伏发电系统电气一次部分设计(开题报告2)

毕业论文(设计)开题报告 题目 分布式光伏发电系统电气一次部分设计 题目类别 毕业设计 姓名 专业 班级 学号 一、选题背景及依据(简述国内外研究状况和相关领域中已有的研究成果(文献综述),选题目的、意义,列出主要参考文献) (一)选题背景与依据 选题背景与依据: …...

【设计模式-迪米特法则】

迪米特法则(Law of Demeter,LoD),也称为最少知识原则(Principle of Least Knowledge),是一种面向对象编程中的设计原则。它的核心思想是:一个对象应当尽可能少地了解其他对象&#x…...

Webpack安装

全局安装 npm install -g webpack webpack-cli安装后查看版本号: webpack -v初始化项目 npm init -yJS打包 webpack目录下创建配置文件webpack.config.js 以下配置的意思是:读取当前项目目录下src文件夹中的main.js(入口文件&#xff09…...

前端开发学习(一)VUE框架概述

一、MVC模式与MVVM模式 1.1mvc模式 MVC模式是移动端应用广泛的软件架构之一,MVC模式将应用程序划分为3部分:Model(数据模型)、View(用户界面视图)和Controller(控制器)。MVC模式的执行过程是将View层展示给用户,也就是通过 HTML页面接受用户动作&#…...

Linux操作系统的背景、发展历程及对比分析

1. UNIX发展历史 unix_百度百科 UNIX操作系统作为现代操作系统的奠基石,其发展历史可以追溯到20世纪60年代末。1969年,贝尔实验室的Ken Thompson、Dennis Ritchie以及他们的同事们为了实现一种多任务的、可移植的、简洁而高效的操作系统,开发…...

gaussdb 基础管理 数据库 表 用户 模式 权限 存储过程

数据库database #创建数据库,指定字符集UTF8,缺省情况下新数据库将通过复制标准系统数据库template0来创建,且仅支持使用template0来创建。 CREATE DATABASE devdb ENCODING UTF8 template template0; CREATE DATABASE testdb; 标识符的命名…...

i9-11900H+3070laptop+win10下的yolov5配置

参考博客:https://blog.csdn.net/qq_67105081/article/details/138232424 关键问题: 1、由之前装的CUDA11.6(有篇博客上可以换版本)CUDNN8.4.0Python3.9.13推后在指定的虚拟环境中装了Pytorch1.12.1(在AnnacondaPrompt下用pip命令…...

conda相比python好处

Conda 作为 Python 的环境和包管理工具,相比原生 Python 生态(如 pip 虚拟环境)有许多独特优势,尤其在多项目管理、依赖处理和跨平台兼容性等方面表现更优。以下是 Conda 的核心好处: 一、一站式环境管理&#xff1a…...

在HarmonyOS ArkTS ArkUI-X 5.0及以上版本中,手势开发全攻略:

在 HarmonyOS 应用开发中,手势交互是连接用户与设备的核心纽带。ArkTS 框架提供了丰富的手势处理能力,既支持点击、长按、拖拽等基础单一手势的精细控制,也能通过多种绑定策略解决父子组件的手势竞争问题。本文将结合官方开发文档&#xff0c…...

【JVM】- 内存结构

引言 JVM:Java Virtual Machine 定义:Java虚拟机,Java二进制字节码的运行环境好处: 一次编写,到处运行自动内存管理,垃圾回收的功能数组下标越界检查(会抛异常,不会覆盖到其他代码…...

定时器任务——若依源码分析

分析util包下面的工具类schedule utils: ScheduleUtils 是若依中用于与 Quartz 框架交互的工具类,封装了定时任务的 创建、更新、暂停、删除等核心逻辑。 createScheduleJob createScheduleJob 用于将任务注册到 Quartz,先构建任务的 JobD…...

基于当前项目通过npm包形式暴露公共组件

1.package.sjon文件配置 其中xh-flowable就是暴露出去的npm包名 2.创建tpyes文件夹,并新增内容 3.创建package文件夹...

P3 QT项目----记事本(3.8)

3.8 记事本项目总结 项目源码 1.main.cpp #include "widget.h" #include <QApplication> int main(int argc, char *argv[]) {QApplication a(argc, argv);Widget w;w.show();return a.exec(); } 2.widget.cpp #include "widget.h" #include &q…...

第一篇:Agent2Agent (A2A) 协议——协作式人工智能的黎明

AI 领域的快速发展正在催生一个新时代&#xff0c;智能代理&#xff08;agents&#xff09;不再是孤立的个体&#xff0c;而是能够像一个数字团队一样协作。然而&#xff0c;当前 AI 生态系统的碎片化阻碍了这一愿景的实现&#xff0c;导致了“AI 巴别塔问题”——不同代理之间…...

c#开发AI模型对话

AI模型 前面已经介绍了一般AI模型本地部署&#xff0c;直接调用现成的模型数据。这里主要讲述讲接口集成到我们自己的程序中使用方式。 微软提供了ML.NET来开发和使用AI模型&#xff0c;但是目前国内可能使用不多&#xff0c;至少实践例子很少看见。开发训练模型就不介绍了&am…...

QT3D学习笔记——圆台、圆锥

类名作用Qt3DWindow3D渲染窗口容器QEntity场景中的实体&#xff08;对象或容器&#xff09;QCamera控制观察视角QPointLight点光源QConeMesh圆锥几何网格QTransform控制实体的位置/旋转/缩放QPhongMaterialPhong光照材质&#xff08;定义颜色、反光等&#xff09;QFirstPersonC…...

招商蛇口 | 执笔CID,启幕低密生活新境

作为中国城市生长的力量&#xff0c;招商蛇口以“美好生活承载者”为使命&#xff0c;深耕全球111座城市&#xff0c;以央企担当匠造时代理想人居。从深圳湾的开拓基因到西安高新CID的战略落子&#xff0c;招商蛇口始终与城市发展同频共振&#xff0c;以建筑诠释对土地与生活的…...