golang学习随记

news2024/9/29 19:26:35

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档

文章目录

  • go学习
    • 快捷键及快速生成代码片段
    • go基础
      • 循环
      • 流程控制关键字
      • 切片,拷贝
      • 函数
        • 闭包
      • defer语句
      • 格式化输出
      • go语言随机数rand.seed()
    • 包管理
    • 并发编程
      • goroutine
      • channel
    • 设计模式
      • 工厂模式
      • 单例模式
      • 抽象工厂模式
      • 适配器模式
      • 享元模式
    • 并发编程
      • 协程原理
      • 创建协程
      • 停止协程
      • 线程休眠、协程休眠
      • 协程状态
      • 协程安全
      • 共享变量和临界区
      • 协程安全数据类型
      • channel通道
      • 通道缓冲
      • 超时处理
      • 非阻塞通道
      • 定时器
        • Ticker
      • 协程同步
      • 协程通信方法
      • 等待和通知
      • go中协程同步和共享内存的方法
      • go中锁的类型
      • 条件变量Cond
      • golang死锁
      • 协程池
      • golang Context在协程中的使用
      • sync.Once
      • GMP
    • 网络编程
      • tcp流行框架
    • epoll相关
      • 操作系统如何知道数据对应哪个socket
      • 如何同时监听多个socket数据
      • epoll的原理和流程
      • CSRF攻击
      • url组成
      • Restful风格编程
      • HttpRouter
    • 单元测试
      • 反射
    • 时间处理库Carbon
      • 一些零碎内容
  • zookeeper
    • 特点
    • 数据模型
    • CAP理论
    • 选举机制
  • Rabbitmq
  • 消息中间件
    • kafka
  • 零碎知识
    • seed
    • salt


在这里插入图片描述

go学习

使用go的一个目的就是解决并发的问题
go语言特点:天生支持高并发 语法简单 内置runtime,支持垃圾回收 可以直接编译成机器码,不依赖其他库 有丰富的标准库,可跨平台编译

快捷键及快速生成代码片段

行注释:shift+/ 块注释:shift+Alt+a 查找文件:ctrl+e

go基础

循环

go中的循环只有for循环,使用更加简洁:for 、for range

流程控制关键字

break continue goto

切片,拷贝

由于数组长度定义好之后不能改变,所以我们可以使用切片的方式来使其可以进行增删改查;赋值的方式是直接将地址赋值,所以我们一般在修改其中一个,另一个也会随之改变;而使用拷贝的方式就只会拷贝其中的值,修改拷贝之后的不会对原有的进行改变

函数

go中的函数就是一级公民,没有类的概念

闭包

闭包+函数+引用环境

defer语句

go语言中的defer语句会将其后便跟随的语句进行延迟处理。且将延迟处理的语句按defer定义的逆序进行执行;
按照其直到return前才会执行的特性,可以用来做资源清理;
用途:关闭文件句柄 锁资源释放 数据库连接释放

格式化输出

%% %字面量
%b 一个二进制整数,将一个整数格式转化为二进制的表达方式
%c 一个Unicode的字符
%d 十进制整数
%o 八进制整数
%x 小写的十六进制数值
%X 大写的十六进制数值
%U 一个Unicode表示法表示的整型码值
%s 输出以原生的UTF8字节表示的字符,如果console不支持utf8编码,则会乱码
%t 以true或者false的方式输出布尔值
%v 使用默认格式输出值,或者如果方法存在,则使用类性值的String()方法输出自定义值
%T 输出值的类型

go语言随机数rand.seed()

go语言中的随机数是通过rand.Seed(种子值seedNum)设置种子值,rand.Intn(n int64)获取小于n的随机数。那么获取随机数n之前,需要设置种子值,作用是同一种子值下,同一n,rand.Intn(n),获取的随机数是相同的。不同种子值,同一n,rand.Intn(n),获取的随机数是不同的。尽量保持种子值的随机性,一般采用系统时间的毫秒值作为种子值,因为系统时间的毫秒值是一直变动的。

包管理

一个文件夹下只能有一个package(这里指直接包含的go文件,如果有子目录,那么子目录和父目录分开谈)
一个package文件不能在多个文件夹下,如果一个go文件需要使用不同目录下的同名package,需要在import这些目录时为每个目录指定一个package别名;多个文件夹下有重名的package,其他他们彼此无关

并发编程

除了使用channel实现之外还可以使用mutex互斥锁

goroutine

Goroutine的创建成本很低,可以轻松创建成千上万个
Goroutine的栈空间会根据需要自动增长或收缩
Goroutine之间的通信通过channel进行,更安全方便
Goroutine可以通过调度器在多个操作系统线程之间进行调度,实现并发执行

channel

channel是Goroutine之间进行通信的管道,用于发送和接收值,作用是实现Goroutine之间的同步和数据传递,通过channel,不同的Goroutine可以安全的共享数据

设计模式

工厂模式

也就是创建一个工厂类负责实例化对象;如工厂负责创建产品,客户端访问工厂类负责实例化具体产品

单例模式

可以保证该系统中,使用该模式的类一个类只有一个实例,即一个类只有一个对象实例:垃圾回收器、数据库连接池都是单例模式

抽象工厂模式

抽象工厂模式是围绕一个超级工厂,创建其他的工厂;在工厂模式中,一个具体的工厂对应一种具体的产品,但是,有时候我们需要工厂可以提供多个产品对象,而不是单一产品对象

适配器模式

适配器模式是作为两个不兼容接口之间的桥梁,将一个类的接口转换为另一个类的接口,使得原本因为接口不兼容而不能一起工作的类可以一起工作

享元模式

减少内存的使用,提高程序的性能;可用sync.Pool实现享元模式,可用于重用和存储对象,对象池可以减少对象的创建和销毁,从而提供程序性能

并发编程

协程原理

1、协程是一种轻量级线程,可以在一个操作系统线程中
2、同时运行多个协程
3、协程的调度和执行由go运行时自动管理,我们无需手动控制线程和协程的创建和销毁
4、协程采用了M:N调度器的模型,M调度器用于管理和调度操作系统线程,N调度器用于管理和调度goroutine
5、当一个goroutine遇到IO操作或者阻塞时,M调度器会将其从操作系统线程中移除,转而将其存放到一个专门的goroutine队列中等待唤醒

创建协程

使用go关键字创建一个协程

停止协程

使用context.Context停止一个协程
使用channel进行协程的关闭
使用布尔变量

线程休眠、协程休眠

线程休眠:可以用time.sleep()来实现
协程休眠:线程休眠的本质是让当前线程进入阻塞状态,而协程休眠就是使用协程来实现非阻塞的休眠

协程状态

分为四种:新建状态 运行状态 阻塞状态 死亡状态

协程安全

协程安全的解决办法:
使用互斥锁
使用读写锁
使用通道
避免共享状态

共享变量和临界区

共享变量指多个线程和协程都可以访问和修改同一个变量,临界区是指在程序执行过程中,访问共享变量的代码块
在编写并发程序时,要仔细设计共享变量和临界区且使用适当的同步机制来保证协程安全,例如添加互斥锁

协程安全数据类型

在使用协程时,要注意哪些数据类型是协程安全的、哪些是不安全的。避免因数据竞争问题导致程序出现异常
基本数据类型、字符串、管道都是协程安全的,可以在多个协程间共享使用
切片虽然是协程安全的,但需要注意在多个协程之间对同一切片进行读写操作时,可能出现数据竞争问题;Map是非协程安全的

channel通道

可以通过make()来创建 可以通过chan来定义

通道缓冲

是发送方可以在接受方准备好接受数据之前发送多个值,而不必等待接收方,当缓冲区满之后就会阻止发送方,直到有空间

超时处理

可以用time.After()实现超时处理

非阻塞通道

select语句和default分支实现了非阻塞通道

定时器

go中可以用time包创建定时器,分为单次定时器和重复定时器
单次定时器:time.After()
重复定时器:time.Tick() time.NewTicker()

Ticker

Ticker类型是一个定时触发的定时器,与Timer类型相似,都是基于是时间的调度器;不过Ticker会重复触发,而Timer只会触发一次

协程同步

指多个协程之间按照一定的顺序执行,从而避免数据竞争和死锁
可以通过协程通信来实现:互斥锁 条件变量 信号量 原子操作

协程通信方法

channel通道 共享内存 waitgroup Mutex互斥锁 Atomic原子操作

等待和通知

可以用以下三种方法:channel sync包中的waitgroup Cond类型来实现

go中协程同步和共享内存的方法

sync.Mutex和sync.Cond channel WaitGroup Atomic Select
golang协程可见性问题也可以用锁和原子操作来保证

go中锁的类型

Mutex RWMutex Cond Once

条件变量Cond

Cond常用方法:
Wait() 等待条件变量,阻塞当前协程,释放锁
Signal() 通知一个等待的协程继续执行,通常与lock()Unlock()一起使用
Broadcast() 通知所有等待的协程继续执行,通常与lock()Unlock()一起使用

golang死锁

发生的原因:
Mutex的嵌套使用 预分配资源不足 通道读写顺序不当
避免死锁的方法:
避免互斥锁的嵌套使用,采用更高级的同步原语:读写锁、条件变量(Cond)等
避免使用全局变量,尽量使用局部变量或者通道传递数据
使用带缓冲区的通道,可避免协程阻塞等待通道的读写操作
使用超时机制
使用可重入函数,避免函数内部调用一个可能会阻塞的函数

协程池

协程池是一个管理和复用协程的技术

golang Context在协程中的使用

例如使用WithTimeout方法创建超时上下文防止后台任务无限期等待
通过使用context可以有效控制协程之间的通信和请求处理,并避免无限期等待和死锁等问题

sync.Once

通过使用Once可以确保一个操作只会被执行一次,避免重复执行导致的问题;例如编写单例模式就可以使用到它

GMP

GMP是golang中调度器的三个重要组成部分之一,是Goroutine执行器
G 代表轻量级线程 M 代表调度器线程 p 代表逻辑处理器
GMP为Golang提供了高效、轻量级的并发模型
GMP调度器的主要任务是将协程绑定到线程上,然后调度器执行线程;为了高效调度,调度器使用了很多优化手段:如抢占式调度

网络编程

tcp流行框架

gRPC
Gnet
TcpServer
Gorilla websocket

epoll相关

网卡将数据写入内存之后,网卡向cpu发出一个中断信号,操作系统便能知道有新数据到来,再通过网卡中断程序去处理数据
进程阻塞不会占用cpu资源是因为进程A阻塞之后,它的引用会被添加到等待队列中,A不会继续往下执行代码,所以也不会占用cpu资源

操作系统如何知道数据对应哪个socket

一个socket对应一个端口号,网络数据包中包含了ip和端口信息,内核可以通过端口号找到对应的socket

如何同时监听多个socket数据

select:西安准备一个数组存放所有需要监视的socket,调用select,如果所有socket都没有数据,就会被阻塞,知道其中有socket接收到数据,select返回并唤醒进程;最后再遍历存放socket的数组,就可以找到就绪的socket

epoll设计思路:(功能分离、就绪列表)
先用epoll_ctl维护等待队列,再用epoll_wait阻塞进程
内核维护一个就绪列表,引用收到数据的socket,当进程别唤醒之后,只要获取就序列表的内容就可以知道哪些socket收到了数据

epoll的原理和流程

创建epoll对象:某个进程调用epoll_create方法时,内核就会创建一个eventpoll对象;由于内核要维护就序列表等数据,而这些数据都可以是eventpoll的成员

维护监视列表 :当socket收到数据后,中断程序会操作eventpoll对象,而不是直接操作进程。
接收数据:当socket收到数据后,中断程序会给eventpoll的“就绪列表”添加socket引用;eventpoll对象相当于是socket和进程之间的中介,socket的数据接收并不直接影响进程,而是通过改变eventpoll的就绪列表来改变进程状态。当程序执行到epoll_wait时,如果rdlist已经引用了socket,那么epoll_wait直接返回,如果rdlist为空,阻塞进程

阻塞和唤醒进程:当socket接收到数据,中断程序一方面修改rdlist,另一方面唤醒eventpoll等待队列中的进程,进程A再次进入运行状态(如下图)。也因为rdlist的存在,进程A可以知道哪些socket发生了变化。

CSRF攻击

在web应用中CSRF是一种常见的安全威胁,为了防御它,可以在cookie中添加CSRF token,每次请求进行验证,来保证安全

url组成

由协议、服务器、端口、路径、查询五部分组成

Restful风格编程

相对于SOAP和XML-RPC,REST更加简单明了;他是一个资源定位、资源操作的风格,只是一种风格;

HttpRouter

HttpRouter是一种轻量级高性能的golang HTTP请求路由器;
gin框架就是以HttpRouter为基础开发的

单元测试

创建测试用例测试函数
可以使用helper函数让报错定位更加准确
setup/teardown视为在调用m.Run()前后做一些额外的准备和回收工作

反射

Go语言中的反射是指在运行时检查程序的结构、变量类型和值,并可以动态地操作它们的能力。反射包(reflect package)提供了一组函数,可以在运行时进行类型检查、获取和修改变量的值、调用方法等。

时间处理库Carbon

一些零碎内容

bcrypt:更加高级的加密算法,密码一般都会用这个加密算法进行加密
访问控制框架: casbin
使用swagger生成api接口文档;它可以根据注释来生成接口文档
jwt:是一种跨域认证解决方案,它规定了一种token实现方式,多用于前后端分离项目中
viper:golang配置管理库,很多项目都用它来构建,像docker等等
新特性工作区workspace;用在一个大型项目分为几个小项目,想要互相导包就需要使用这个工作区,否则不同的项目之间不能互相导包
泛型:就是函数的参数,支持更多的类型,而并不是某一特定的类型
cast:golang类型转换工具;cast.ToString()等等
flag:用flag包处理命令行参数

zookeeper

特点

顺序一致性 原子性 单一视图 可靠性 实时性(伪实时性)

数据模型

树形结构,是由ZNODE节点组成的树形结构

CAP理论

指在一个分布式系统中,一致性、可用性、分区容错性只能同时满足两个

选举机制

使用基于ZAB协议的leader选举机制;节点间相互通信,通过提议和投票确定新的leader,当收到多数节点的票数即成为新的leader

Rabbitmq

消息中间件

基于队列与消息传递技术,在网络环境中提供同步或异步,可靠的消息传输的支撑性软件系统
消息中间件的模式:点对点模式 发布订阅模式

kafka

为了对kafka消息进行分类,保存在kafka中的数据按照主题(topic)进行了逻辑分类;为了实现负载均衡和水平扩展,kafka将主题划分为多个分区(partition),会根据分区规则选择把消息存储在哪个分区中;kafka副本能够对抗部分服务器宕机带来的数据不可用情况
kafka集群中每个服务器被称作broker
kafka不会向消费者推送消息,消费者必须从kafka主题分区中提取消息
消费者组最大的并行度等于该主题的分区数

零碎知识

seed

seed通常用于生成随机数序列,种子的选择对生成的随机数序列具有重要影响。如果使用相同的种子,将获得相同的随机数序列。因此,在实际应用中,通常会使用不可预测的种子,例如使用时间戳或其他随机数来设置种子,以获得更随机的结果。

salt

“salt”(盐)是一种随机生成的数据,用于增加密码哈希的安全性。哈希函数是将输入数据转换为固定长度的输出,通常用于存储密码的散列值。
使用盐可以防止相同的密码在哈希过程中产生相同的散列值。通过将盐与密码组合,并进行哈希运算,可以生成一个唯一的散列值。这样,即使两个用户使用相同的密码,由于使用了不同的盐,最终生成的散列值也会不同。
在Go语言中,可以使用crypto/rand包来生成随机的盐。例如,可以使用rand.Read()函数生成随机的字节切片作为盐。然后,将盐与密码进行组合,并使用哈希函数(如SHA256)对其进行哈希运算,以生成最终的散列值。

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

LangChain源码逐行解密之LLMs(一)

LangChain源码逐行解密之LLMs(一) 18.1 LangChain应用程序演示 本节会以一个简单的应用程序为切入点,进入到LangChain的源码部分,带领大家贯通整个LangChain最核心的框架源码,我们的应用程序不会太复杂,只是分析LangChain源码的切入点或者入口点。 如图18-1所示,是应用程…

【洋码头关键词获取商品列表技术解析】

洋码头关键词获取商品列表功能简介 洋码头的关键词获取商品列表功能是为了满足用户的个性化需求,提供更精准、更有针对性的商品推荐。用户可以输入关键词搜索,系统会根据关键词从海量的商品库中筛选出相关的商品列表,从而使用户更容易找到所需…

【目标检测系列】YOLOV1解读

前言 从R-CNN到Fast-RCNN,之前的目标检测工作都是分成两阶段,先提供位置信息在进行目标分类,精度很高但无法满足实时检测的要求。 而YoLo将目标检测看作回归问题,输入为一张图片,输出为S*S*(5*BC)的三维向量。该向量…

PyTorch 微调终极指南:第 2 部分 — 提高模型准确性

一、说明 如今,在训练深度学习模型时,通过在自己的数据上微调预训练模型来迁移学习已成为首选方法。通过微调这些模型,我们可以利用他们的专业知识并使其适应我们的特定任务,从而节省宝贵的时间和计算资源。本文分为四个部分&…

AI文档识别技术之表格识别 (一)

AI文档识别技术之表格识别(一) 文章目录 文章目录 AI文档识别技术之表格识别(一)1. 表格识别原理介绍1.1 表格类型分类1.2 识别原理 2. 整体识别流程2.1 流程图2.2 图像处理部分大致流程 3. 将表格转换为html与json格式输出3.1 html格式3.2 json格式3.3 表格识别实例 前言 此文…

可靠传输概述——停止-等待协议

基本概念: 使用差错检测技术(例如循环冗余校验CRC),接收方的数据链路层就可检测出帧在传输过程中是否出现了误码。 此时有: 不可靠传输服务:仅仅丢弃有误码的帧,其他什么也不做 可靠传输服务&a…

Weblogic未授权远程代码执行漏洞 (CVE-2023-21839)

前言: Weblogic 允许远程用户在未经授权的情况下通过IIOP/T3进行JNDI lookup 操作,当JDK版本过低或本地存在javaSerializedData时,这可能会导致RCE漏洞。 0x00 环境设置 此次实验,我们使用P神的vulhub。启动环境: cd…

Android Studio实现图形验证码

源代码 源代码MainActivity 效果图32行需要修改,不修改会报错:需要常量表达式,我的代码已修改 点击后 MainActivity import static com.example.graphicverificationcode.RxCaptcha.TYPE.NUMBER;import android.annotation.SuppressLint; import android.os.Bundle; impo…

【Terraform学习】保护敏感变量(Terraform配置语言学习)

实验步骤 创建 EC2 IAM 角色 导航到IAM 在左侧菜单中,单击角色 。单击创建角色该按钮以创建新的 IAM 角色。 在创建角色部分,为角色选择可信实体类型: AWS 服务 使用案例:EC2 单击下一步 添加权限:现在,您可以看到…

Sentieon | 每周文献-Multi-omics(多组学)-第九期

多组学系列文章-1 标题(英文): Prediction of axillary lymph node metastasis in triple-negative breast cancer by multi-omics analysis and an integrated model标题(中文): 基于多组学分析和综合模型…

Java使用String来开发验证码

Java使用String来开发验证码 需求分析代码实现小结Time 需求分析 使用String来开发验证码。 实现随机产生验证码,验证码的每位可能是数字、大写字母、小写字母 根据需求分析,步骤如下: 1.首先,设计一个方法,该方法接收…

细胞——求细胞数量 C++详解

细胞——求细胞数量 C详解 求细胞数量题目描述输入格式输出格式样例样例输入样例输出 提示数据规模与约定 解法代码 求细胞数量 题目描述 一矩形阵列由数字 0 0 0 到 9 9 9 组成,数字 1 1 1 到 9 9 9 代表细胞,细胞的定义为沿细胞数字上下左右若还…

产品经理回到三线城市能去干什么?

首先要强调一个重要原则:尽量待在一线城市。我们付出了很多努力,在大城市生活了好几年,如果不能在这里获得成功,真的愿意回到原来的地方吗?我出生在山东农村,家庭条件很普通。自从上大学时,我就…

企业权限管理(二)-环境搭建

环境搭建 项目的基本架构 pom.xml <?xml version"1.0" encoding"UTF-8"?> <project xmlns"http://maven.apache.org/POM/4.0.0"xmlns:xsi"http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation"http://mav…

Drools用户手册翻译——第四章 Drools规则引擎(十三)复杂事件处理(CEP)会话时钟,事件流和切入点

甩锅声明&#xff1a;本人英语一般&#xff0c;翻译只是为了做个笔记&#xff0c;所以有翻译错误的地方&#xff0c;错就错了&#xff0c;如果你想给我纠正&#xff0c;就给我留言&#xff0c;我会改过来&#xff0c;如果懒得理我&#xff0c;就直接划过即可。 目录 会话时钟…

无货源无技术无专业做跨境电商?Live Market一站式服务助你出海

近年来&#xff0c;我国跨境电商发展取得可喜进展。商务部数据显示&#xff0c;跨境电商货物进出口规模占外贸比重由5年前的不足1%上升到目前的5%左右。越来越多的资本开始重视这一领域&#xff0c;越来越多的玩家开始布局。 然而&#xff0c;对于普通商家来说想要踏足跨境电商…

解决VtsHalLightTargetTest问题

一、问题描述&#xff1a; 二、解决方案&#xff1a; Date: Fri, 14 Jul 2023 11:14:31 0800 Subject: [PATCH] fix: 解决VtsHalLightTargetTest问题Description:依据报错修改代码Self Test:PassChange-Id: Ia0bca62480cd26845b285ae61c3d8264d8555d9a ---diff --git a/aidl/d…

软件开发项目文档清单(多套实际案例)

写在前面&#xff1a; 我花了一些时间整理了这些年从事软件行业以来的文档&#xff0c;将它们分类整理后&#xff0c;电脑瞬间变得更加简洁。我整理了数百份软件开发过程中的常用文档&#xff0c;包括项目计划、立项计划、需求分析、概要设计、详细设计、数据库设计、用户操作手…

mysql不用窗口函数,后面加一列序号

前言 在后端开发中最常用的数据库还是比较稳定的5.8&#xff0c;而窗口函数是只有在mysql8以上才有的&#xff0c;然后在开发中有个需要排序序号的需求&#xff0c;翻找资料&#xff0c;问AI得出结论可以实现。 列出方法 如果你使用的是MySQL 5.7版本&#xff0c;而没有窗口…

好的测试数据管理,到底要怎么做?

你的组织是否实施了测试数据管理&#xff1f;如果你的组织处理关键或敏感的业务数据&#xff0c;测试数据管理肯定会让组织受益。与测试数据相关的问题占所有软件缺陷的 15%&#xff0c;这一事实强调了测试数据的重要性。本文将准确讨论测试数据经理职责、测试数据经理需要什么…