三天Golang快速入门—面向对象
面向对象
- Golang接口的定义
- go中类
- 空接口
- 空接口作为函数的参数
- 切片实现空接口
- map的值实现空接口
- 类型断言
- 值接收者和指针接收者
- 值接收者
- 指针接收者
- 接口嵌套
Golang接口的定义
- 接口
interface是一种抽象的类型。 - 接口定义了一个对象的行为规范,
只定义规范不实现,由具体的对象来实现规范的细节。 - 一个对象只要全部实现了接口中的方法,那么就实现了这个接口。
看一个接口示例
package mainimport "fmt"// 1.接口时一个规范
type Usber interface {start()stop()
}// 2.如果接口里面有方法的话,必须要通过结构体或者通过自定义类型实现这个接口
type Phone struct {Name string
}// 3.手机要实现usb借口的话必须实现usb接口中所有方法
func (p Phone) start() {fmt.Println(p.Name, "启动")
}
func (p Phone) stop() {fmt.Println(p.Name, "关机")
}func main() {p := Phone{Name: "小米手机"}var p1 Usber // 接口就是一个数据类型p1 = p // 表示手机实现Usb接口p1.start()p1.stop()
}
/*
小米手机 启动
小米手机 关机
*/
go中类
- 没有类的概念,也不支持类的继承等面向对象的概念。
- 通过结构体内嵌配合接口比面向对象具有更高的扩展性和灵活性。
空接口
- golang中空接口也可以直接当做类型使用,泛型概念
- 接口可以不定义任何方法,没有定义任何方法的接口就是空接口
- 空接口表示没有约束
- 空接口可以表示任意数据类型
空接口作为函数的参数
package mainimport "fmt"// 空接口作为函数的参数
func show(a interface{}) {fmt.Printf("值:%v 类型:%T\n", a, a)
}func main() {show(20) // 值:20 类型:intshow("你好") // 值:你好 类型:stringSlice := []int{1, 2, 3, 4}show(Slice) // 值:你好 类型:string
}
切片实现空接口
package mainimport "fmt"func main() {var Slice = []interface{}{"张三", 20, true, 20.2}fmt.Println(Slice) // [张三 20 true 20.2]}
map的值实现空接口
package mainimport "fmt"func main() {// 空接口作为 map 值var studentInfo = make(map[string]interface{})studentInfo["name"] = "张三"studentInfo["age"] = 10studentInfo["married"] = falsefmt.Println(studentInfo) // map[age:10 married:false name:张三]
}
类型断言
- 一个接口的值是由一个具体类型和具体类型的值两部分组成的。
- 这两部分分别称为接口的动态类型和动态值。
- 如果想要判断空接口中值的类型,那么可以使用类型断言。
- 语法格式:
x.(T) - x:表示类型为interfact{}的变量
- T:表示断言x可能是的类型
package mainimport "fmt"func main() {var x interface{}x = "hello golang"v, ok := x.(string)if ok {fmt.Println(v)} else {fmt.Println("非字符串类型")}
}
值接收者和指针接收者
值接收者
package mainimport "fmt"type Mover interface {move()
}type Dog struct {
}// 值接收者实现接口
func (d Dog) move() {fmt.Println("狗会动")
}func main() {var x Movervar wangcai = Dog{} // 旺财是值类型x = wangcai // x可以接收Dog类型var fugui = &Dog{} // 富贵是指针类型x = fugui // x可以接收*Dog类型x.move()
}/*
用值接收者实现接口后,不管是Dog结构体还是结构体指针*Dog类型的变量都可以赋值给该接口变量。
因为Go中有对指针类型变量求值的语法糖,Dog指针fugui内部会自动求值*fugui。
*/
指针接收者
package mainimport "fmt"type Mover interface {move()
}type Dog struct {
}// 指针接收者实现接口
func (d *Dog) move() {fmt.Println("狗会动")
}func main() {var x Movervar wangcai = Dog{} // 旺财是值类型x = wangcai // x不可以接收Dog类型var fugui = &Dog{} // 富贵是指针类型x = fugui // x可以接收*Dog类型x.move()
}
/*
Move接口的接收者是指针类型,所以不能给x传入Dog类型的wangcai,因此x只能存储*Dog类型的值。
*/
接口嵌套
package mainimport "fmt"type Sayer interface {say()
}type Mover interface {move()
}// 接口嵌套
type animal interface {SayerMover
}type cat struct {name string
}func (c cat) say() {fmt.Println("喵喵喵")
}func (c cat) move() {fmt.Println("猫动了")
}func main() {var x animalx = cat{name: "大橘"}x.move()x.say()
}
相关文章:
三天Golang快速入门—面向对象
面向对象Golang接口的定义go中类空接口空接口作为函数的参数切片实现空接口map的值实现空接口类型断言值接收者和指针接收者值接收者指针接收者接口嵌套Golang接口的定义 接口interface是一种抽象的类型。接口定义了一个对象的行为规范,只定义规范不实现࿰…...
开发手册——一、编程规约_6.并发处理
这篇文章主要梳理了在java的实际开发过程中的编程规范问题。本篇文章主要借鉴于《阿里巴巴java开发手册终极版》 下面我们一起来看一下吧。 1. 【强制】获取单例对象需要保证线程安全,其中的方法也要保证线程安全。 说明:资源驱动类、工具类、单例工厂…...
ACM---大一第三周周赛(Floyd算法+并查集算法学习周)
🚀write in front🚀 📝个人主页:认真写博客的夏目浅石.CSDN 🎁欢迎各位→点赞👍 收藏⭐️ 留言📝 📣系列专栏:ACM周训练题目合集.CSDN 💬总结:…...
spring整合mybatis和Junit
该项目使用spring纯注解方式开发,用配置类取代spring的配置文件 一、导入依赖 整合Junit需要导入spring-test 整合mybatis需要导入spring-jdbc、mybatis-spring <dependencies><!-- https://mvnrepository.com/artifact/org.springframework/spring-cont…...
Spring Boot 3.0系列【7】核心特性篇之JSON
有道无术,术尚可求,有术无道,止于术。 本系列Spring Boot版本3.0.3 源码地址:https://gitee.com/pearl-organization/study-spring-boot3 文章目录 前言JSON什么是JSON常用JSON 库GsonFastJsonJacksonJackson 还是 FastjsonSpring Boot 中的 JSON1. 自动配置 Jackson2. @…...
【数据结构初阶】二叉树顺序结构:堆的实现
前言 前边077带着大家学习了树与二叉树的相关概念,这篇文章我们来实现一个二叉树的顺序结构。 二叉树的顺序结构 普通的二叉树是不适合用数组来存储的,因为可能会存在大量的空间浪费。而完全二叉树更适合使用顺序结构存储。现实中我们通常把堆(一种二叉…...
C/C++:动态内存管理
目录 一. C/C内存分布 二. C/C动态内存管理 2.1 C语言动态内存管理 2.2 C动态内存管理 2.2.1 new/delete操作符 2.2.2 operator new与operator delete函数 2.3 new/delete的实现原理 2.4 定位new(placement - new) 2.5 new/delete和malloc/free的…...
黑猫带你学eMMC协议第28篇:eMMC的开漏和推挽模式(push-pull open drain)
本文依据eMMC JEDEC5.1及个人工作经验整理而成,如有错误请留言。 文章为个人辛苦整理,付费内容,已加入原创侵权保护,禁止私自转载。 文章所在专栏:《黑猫带你学:eMMC协议详解》 1 什么是开漏和推挽 1.1 推挽电路是什么 关于推挽和开漏电路,更多介绍详见我的另一篇文章…...
simulink PID控制
系列文章目录 文章目录系列文章目录前言一、非线性系统线性化原理二、反馈控制开环控制反馈or闭环控制PID ControllerPID微调案例总结前言 将非线性系统近似线性化PIDblock与微调 提示:以下是本篇文章正文内容,下面案例可供参考 一、非线性系统线性化 …...
如何在for循环内执行异步操作
var定义的i是全局的,每次遍历都会覆盖,最后i的值为10,所以输出10次10 for (var i 0; i < 10; i) {setTimeout(function () {console.log(i) // 输出10遍10}, 1000 i * 100)}setTimeOut 第三个函数 for (var i 0; i < 10; i) {setT…...
性能测试——LoadRunner: Controller的使用
Controller Controller是用来创建测试环境,执行在VUG中编写的测试脚本 可以直接点击Controller的快捷方式打开,也可以在VUG中打开 这里将虚拟用户数设置为3,比较适合自己的电脑性能 整个controller分为下面几个模块 这里先设置左下角的目标计划 设置初始化:双击…...
ChatGPT解答:纯前端文档预览,Vue实现,无需后端,支持Word、Excel、PPT、pdf、文本、图片,附接入demo和文档
ChatGPT解答:纯前端文档预览,Vue实现,无需后端,支持Word、Excel、PPT、pdf、文本、图片,附接入demo和文档 ChatGPTDemo Based on OpenAI API (gpt-3.5-turbo). 纯前端文档预览,Vue实现,无需后…...
刷题记录:牛客NC13950 Alliances 到树上联通点集的最短距离
传送门:牛客 题目描述: 题目较长,此处省略 输入: 7 1 2 1 3 2 4 2 5 3 6 3 7 2 2 6 7 1 4 3 5 1 2 1 1 1 5 2 1 2 输出: 2 1 1一道比较复杂的树题.需要一些复杂的讨论以及LCA知识 对于LCA,可以使用树链剖分进行解决 然后我们看一下题目,我们会发现有这样一个简单的结论,那就…...
行为型模式 - 状态模式State
学习而来,代码是自己敲的。也有些自己的理解在里边,有问题希望大家指出。 个人理解:感觉像桥接模式 代理模式。不知道这么想对不对,还希望笔记在放出后,有大佬彻底了解了给我解解惑。 策略模式的定义与特点 策略&…...
电视剧《狂飙》太过诡异,主演各个悄无声息,龙套演员却身价倍增
说起电视剧《狂飙》,相信很多人都有过观看,这部以反腐为题材的大剧,尺度之大近年来绝无仅有。不过观众在被剧情震撼的同时,也发现了一些诡异的事情,比如说主角和配角的反差,让人感觉很不适应。 在电视剧《狂…...
【微信小程序】-- 案例 - 本地生活(二十)
💌 所属专栏:【微信小程序开发教程】 😀 作 者:我是夜阑的狗🐶 🚀 个人简介:一个正在努力学技术的CV工程师,专注基础和实战分享 ,欢迎咨询! &…...
LeetCode 每日一题 2023/2/27-2023/3/5
记录了初步解题思路 以及本地实现代码;并不一定为最优 也希望大家能一起探讨 一起进步 目录2/27 1144. 递减元素使数组呈锯齿状2/28 2363. 合并相似的物品3/1 2373. 矩阵中的局部最大值3/2 面试题 05.02. 二进制数转字符串3/3 1487. 保证文件名唯一3/4 982. 按位与为…...
SpringMVC中JSON数据的设置、RestFul风格
Java知识点总结:想看的可以从这里进入 目录3.4、JSON数据3.4.1、前端使用3.4.2、后端使用1、Jackson2、fastjson3.5、RestFul风格3.5.1、简介3.5.2、使用3.4、JSON数据 3.4.1、前端使用 前端在JavaScript中有封装的JSON对象,可以直接用来操作JSON数据。…...
Clion连接Docker,使用HElib库
文章目录需求Clion连接服务器内的DockerDockerCLionDocker内配置HElib库参考需求 HElib库是用C编写的同态加密开源库,一般在Linux下使用为了不混淆生产环境,使用Docker搭建HElib运行环境本地在Windows下开发,使用的IDE为Clion,本…...
go网络编程-websocket
1. WebSocket编程 文章目录1. WebSocket编程1.1.1. webSocket是什么1.1.2. 举个聊天室的小例子server.go文件代码hub.go文件代码data.go文件代码local.html文件代码1.1.1. webSocket是什么 WebSocket是一种在单个TCP连接上进行全双工通信的协议 WebSocket使得客户端和服务器之…...
[特殊字符] 智能合约中的数据是如何在区块链中保持一致的?
🧠 智能合约中的数据是如何在区块链中保持一致的? 为什么所有区块链节点都能得出相同结果?合约调用这么复杂,状态真能保持一致吗?本篇带你从底层视角理解“状态一致性”的真相。 一、智能合约的数据存储在哪里…...
观成科技:隐蔽隧道工具Ligolo-ng加密流量分析
1.工具介绍 Ligolo-ng是一款由go编写的高效隧道工具,该工具基于TUN接口实现其功能,利用反向TCP/TLS连接建立一条隐蔽的通信信道,支持使用Let’s Encrypt自动生成证书。Ligolo-ng的通信隐蔽性体现在其支持多种连接方式,适应复杂网…...
【Linux】shell脚本忽略错误继续执行
在 shell 脚本中,可以使用 set -e 命令来设置脚本在遇到错误时退出执行。如果你希望脚本忽略错误并继续执行,可以在脚本开头添加 set e 命令来取消该设置。 举例1 #!/bin/bash# 取消 set -e 的设置 set e# 执行命令,并忽略错误 rm somefile…...
3.3.1_1 检错编码(奇偶校验码)
从这节课开始,我们会探讨数据链路层的差错控制功能,差错控制功能的主要目标是要发现并且解决一个帧内部的位错误,我们需要使用特殊的编码技术去发现帧内部的位错误,当我们发现位错误之后,通常来说有两种解决方案。第一…...
Leetcode 3577. Count the Number of Computer Unlocking Permutations
Leetcode 3577. Count the Number of Computer Unlocking Permutations 1. 解题思路2. 代码实现 题目链接:3577. Count the Number of Computer Unlocking Permutations 1. 解题思路 这一题其实就是一个脑筋急转弯,要想要能够将所有的电脑解锁&#x…...
React Native在HarmonyOS 5.0阅读类应用开发中的实践
一、技术选型背景 随着HarmonyOS 5.0对Web兼容层的增强,React Native作为跨平台框架可通过重新编译ArkTS组件实现85%以上的代码复用率。阅读类应用具有UI复杂度低、数据流清晰的特点。 二、核心实现方案 1. 环境配置 (1)使用React Native…...
项目部署到Linux上时遇到的错误(Redis,MySQL,无法正确连接,地址占用问题)
Redis无法正确连接 在运行jar包时出现了这样的错误 查询得知问题核心在于Redis连接失败,具体原因是客户端发送了密码认证请求,但Redis服务器未设置密码 1.为Redis设置密码(匹配客户端配置) 步骤: 1).修…...
Hive 存储格式深度解析:从 TextFile 到 ORC,如何选对数据存储方案?
在大数据处理领域,Hive 作为 Hadoop 生态中重要的数据仓库工具,其存储格式的选择直接影响数据存储成本、查询效率和计算资源消耗。面对 TextFile、SequenceFile、Parquet、RCFile、ORC 等多种存储格式,很多开发者常常陷入选择困境。本文将从底…...
JVM 内存结构 详解
内存结构 运行时数据区: Java虚拟机在运行Java程序过程中管理的内存区域。 程序计数器: 线程私有,程序控制流的指示器,分支、循环、跳转、异常处理、线程恢复等基础功能都依赖这个计数器完成。 每个线程都有一个程序计数…...
C++:多态机制详解
目录 一. 多态的概念 1.静态多态(编译时多态) 二.动态多态的定义及实现 1.多态的构成条件 2.虚函数 3.虚函数的重写/覆盖 4.虚函数重写的一些其他问题 1).协变 2).析构函数的重写 5.override 和 final关键字 1&#…...
