- 博客(22)
- 收藏
- 关注
原创 等待组(waitgroup)
首先先介绍等待组是什么?Go语言中的等待组()是一种用于协调多个 goroutine 同步执行的机制。它通过计数器来跟踪正在执行的 goroutine 数量,允许主 goroutine 等待所有子 goroutine 完成后再继续执行。为什么要使用等待组?防止主 goroutine 提前退出默认情况下,主 goroutine 不会等待子 goroutine 完成。若不使用同步机制,子 goroutine 可能未执行完毕,程序就退出了。等待组通过Wait()阻塞主流程,确保所有子任务完成。
2025-06-09 18:25:14
784
原创 Go语言的原子操作
原子操作即是进行过程中不能被中断的操作,针对某个值的原子操作在被进行的过程中,CPU绝不会再去进行其他的针对该值的操作。具体的原子操作在不同的操作系统中实现是不同的。比如在Intel的CPU架构机器上,主要是使用总线锁的方式实现的。大致的意思就是当一个CPU需要操作一个内存块的时候,向总线发送一个LOCK信号,所有CPU收到这个信号后就不对这个内存块进行操作了。等待操作的CPU执行完操作后,发送UNLOCK信号,才结束。在AMD的CPU架构机器上就是使用MESI一致性协议的方式来保证原子操作。
2025-05-31 14:29:15
905
1
原创 Go语言的context
context可以用来在goroutine之间传递上下文信息,相同的context可以传递给运行在不同goroutine中的函数,上下文对于多个goroutine同时使用是安全的,context包定义了上下文类型,可以使用backgroundTODO创建一个上下文,在函数调用链之间传播context,也可以使用WithCancel或WithValuecontext的作用就是在不同的goroutine之间同步请求特定的数据、取消信号以及处理请求的截止日期。目前我们常用的一些库都是支持context的,例如。
2025-05-31 14:28:36
1073
原创 Go语言chan底层原理
管道:本质上就是一个数据结构--队列(先进先出)它本身就是并发安全的,不需要加锁。管道是有类型的,一个string类型的管道只能存放string类型的数据。管道是引用类型。
2025-05-04 18:38:06
924
原创 Go语言接口实现面对对象的三大特征
但是在go语言稍微有点区别,其实继承已经改为实现接口,虚函数重写其实就是类似一个接口,通过对接口定义的方法进行重写,最后通过接口对象获取不同的类型,从而达到一个多态的效果。所以接口是比较抽象的东西,他的这个类型只是存储了共同的方法,这样的目的就是为了实现不管传入是什么类型的,都可以实现他的方法。并且继承之后,也可以调用父类的方法,不过虽然是调用父类的方法,但是本质你还是修饰的父类,所以打印的内容还是属于是父类的。接口的嵌套,也就是接口里包含接口,要实现的话,父接口,就必须实现所有的子接口才可以。
2025-05-04 18:34:39
1156
原创 HTTP知识速通
这里涉及了长连接的问题,对他做出一个解释 : 在进行http传输之前首先要进行tcp的三次握手,建立之后才可以发送http报文,但是每一次发送完报文,它就会自动断开tcp链接,导致每一次发送请求都需要建立连接,造成了很大的开销,所以后续的版本里就引入了长连接,不会导致每次请求都需要建立和断开连接。对于 HTTP/1 和 HTTP/2 协议,TCP 和 TLS 是分层的,分别属于内核实现的传输层,openssl 库实现的表示层,因此它们难以合并在一起,需要分批次来握手,先 TCP 握手,再 TLS 握手。
2025-05-01 14:49:22
1355
原创 Go语言的协程
上述我们引入了互斥锁.(但是性能比较低)我们可以引入其他的锁在sync下除了互斥锁还有读写锁,对这两个锁做一个简单的介绍1.互斥锁:简单的说就是实现在一个时刻内只有一个线程可以执行Lock()枷锁之后,其他同时进行的协程就会进入阻塞,直到Unlock()解锁为止。// 加入互斥锁//在他下面有两个方法分别是Lock()和Unlock()2.读写锁:他是一种对互斥锁的扩展,允许多个goroutine并发的读取共享数据,但是写操作还是独占的。
2025-04-27 15:15:14
972
原创 Go语言的泛型实现
泛型(Generics)是一种编程思想,它允许在编写代码时使用未知的类型。泛型可以增加代码的灵活性和可复用性,同时还能提高代码的安全性和可读性。
2025-04-27 15:13:33
331
原创 Go语言的指针原理
在go语言里面的指针比较简单,不存在指针操作& 取地址* 根据地址取值基本上大致就和c语言实差不多的(但是在go语言里面,是不支持对指针的算数操作的)看下取地址的值是怎么样的吧在学完new和make,接下来就说一下如何使用他们开辟空间,以及一些常见的操作age int在上述代码中:p1和p2的效果是一样的,就是实体化一个对象,分配空间,返回一个指针p1和p3的区别就是返回的类型不一样,p1是指针类型,p3是值类型p4也是值类型,具有Person类型的零值。
2025-04-27 15:12:55
434
原创 Go语言接口的特性实现
但是在go语言稍微有点区别,其实继承已经改为实现接口,虚函数重写其实就是类似一个接口,通过对接口定义的方法进行重写,最后通过接口对象获取不同的类型,从而达到一个多态的效果。所以接口是比较抽象的东西,他的这个类型只是存储了共同的方法,这样的目的就是为了实现不管传入是什么类型的,都可以实现他的方法。并且继承之后,也可以调用父类的方法,不过虽然是调用父类的方法,但是本质你还是修饰的父类,所以打印的内容还是属于是父类的。接口的嵌套,也就是接口里包含接口,要实现的话,父接口,就必须实现所有的子接口才可以。
2025-04-27 15:11:52
399
原创 Go语言map的底层原理
hmap结构hmap是map的顶层结构,包含了管理map操作所需要的各类元数据。(比如哈希种子,桶的数量,桶的地址)其次hmap通过buckets字段(指针类型)引用了所有的bucket。buckets是一个指向bucket数组的指针,数组中的每一个元素就是一个bmap。bmap结构bamp是实际存储键值对的结构。每一个bamp可以存储多个键值对,并且包含溢出指针,用来处理哈希冲突的情况。bmap结构内的数组包含了多个键值对槽位 (key/val。
2025-04-27 15:10:33
1103
原创 Go语言切片底层讲解
var a []TT 就代表类型。//声明切片// fmt.Println(c == d) 切片是引用,不支持直接比较,只能和nil比较这里可以会看到这个 var a []string和var b = []int{},为什么前者是nil而后者不是?原因是后者已经初始化了,已经给他分配了一个arr的地址,而前者并未初始化,它里面的指针是指向nil其次就是切片不可以进行比较。
2025-04-27 15:08:23
386
原创 Go语言的数组底层讲解
其中,arrayName 是数组的名称,size 是数组的大小,dataType 是数组中元素的数据类型。1.首先会对定义的数组默认值为0,也就是一个默认初始化。2.还可以初始化列表来初始化数组还可以简化上述语言,使用 :=3.根据索引来初始化注意事项:在Go语言里面,数组的大小是类型的一部分,因此不同大小的数组是不兼容的,也就是说[5]int和[10]int是不同的类型。
2025-04-27 15:07:18
327
原创 Go语言的基本数据类型以及底层讲解
本章将系统讲解Go语言基础数据类型的核心知识体系。注:变量与常量作为数据载体,本章将简要概述其基本概念,重点聚焦于类型本身的特性解析。通过本单元的学习,读者不仅能掌握Go语言的数据类型使用规范,更能建立起从代码到内存的立体认知框架(如果感觉作者写的还不错,不妨点一个免费的关注和赞捏,我把语雀的原文展示出来,让大家更方便的观看。
2025-04-27 15:06:17
1010
原创 Go语言的异常处理机制
defer(延迟执行):语句用于延迟执行一个函数调用,直到包含该defer语句的函数返回时才执行。在资源释放、日志记录等场景中尤为有用如果有多个defer语句,它们按后进先出(LIFO)顺序(先声明的后执行)defer语句的执行时机在函数返回之前,即使它位于return之后执行。panic(恐慌):用于触发一个运行时的错误,它可以在程序的任何地方引发,一旦触发,他会立刻停止当前函数的执行,并且开始回溯调用栈,直到遇到recover或者程序终止。recover。
2025-04-27 15:03:39
1055
原创 Go的GC垃圾回收
Golang中的垃圾回收主要应用三色标记法,GC过程和其他用户goroutine可并发运行,但需要一定时间的,所谓三色标记法实际上就是通过三个阶段的标记来确定清楚的对象都有哪些?对象分为三种颜色标记:黑、灰、白黑对象代表,对象自身存活,且其指向对象都已标记完成灰对象代表,对象自身存活,但其指向对象还未标记完成白对象代表,对象尙未被标记到,可能是垃圾对象标记开始前,将根对象(全局对象、栈上局部变量等)置黑,将其所指向的对象置灰。
2025-04-27 09:16:05
676
原创 Go语言内存管理
本章节,就来学习一下go语言的内存模型,看一下内存的分配,存储都是如何实现的,与此同时,在正式开始今天的主题之前,首先先来学习操作系统基于这一方面的内容,来看看是如何管理内存的吧本章及节内容参考小徐先生和刘丹冰老师的内容,加上一些个人注解,go语言版本是1.24.1,由于文章的内容是在语雀,这里就附上我的语雀链接,方便大家更好的查看。
2025-04-27 09:11:22
894
1
原创 深入了解go语言之GMP模型
先来说说为什么将GMP模型作为深入了解go语言的开篇,首先就是GMP模型虽然在写代码的时候并不会涉及,但是它的调度其实在很多底层的代码都是涉及的,他是你学习其它并发模型底层的一个理论基础本章节涉及部分操作系统的内容,在这之前会先简单介绍一下,那么话不多说,进入正题吧。本篇文章主要摘选小徐先生的博客和刘丹冰老师的书籍,加上个人的注解和修补,把主要的知识点和面试点突出出来,方便大家学习和了解,至于具体的内容还是需要大家投入精力去阅读源码。文章,由于本篇文章的基础是在语雀上,在这边可能格式少有不美观。
2025-04-19 14:20:47
932
原创 defer和return由浅入深,讲解底层。
做一个简单的区别这个return和defer的底层原理,这个是我从自己的语雀复制过来可能,没有做特别的格式对齐,我把网址附上,想要了解的都可以具体访问这个网址https://www.yuque.com/chenxiangyang-n12yg/pli7v5/mgq74fwc64eestot?singleDoc# 《2.defer和return》如果有什么错误的地方也希望大家提出。本文主要是针对的底层原理和基本应用,像return返回函数类型那些,就不再过多介绍。
2024-11-05 19:41:39
1756
原创 Docker的部署(以go为例子)
往往在实际的开发里面的web,涉及的到内容往往非常多。比如redis,mysql,nginx等等一系列的内容,一个一个部署又非常的麻烦,那有什么快速部署,启动他们的方法嘛?当然有,那就是它可以同时部署多个容器,并且同时启动。具体就展示一个例子,来看他是如何实现的吧:(这也就是一个展示,具体的内容还是上网搜索即可。# yaml 配置services:# MySQL容器mysql:# command: #初始化命令导入我们的sql语句,去创建表# -environment: # 设置密码。
2024-10-19 15:38:58
2264
1
原创 pytorch基础知识(个人学习记录分享)
张量(tensor)表示一个数值组成的数组,这个数组可能有多个维度,它是pytorch中最基本的数据结构。dataset,timeout=0,在实践中,主要修改的参数以下标为橙色num_workers是用来指定多进程读取数据时的进程数目的参数。在使用多进程读取数据时,系统会启动多个进程来并行读取数据,加快数据读取的速度。通过设置num_workers参数,我们可以控制启动的进程数目,从而对系统资源的利用进行优化,避免资源的浪费或者过载。
2024-05-01 19:35:43
2240
2
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人