go语言学习
文章平均质量分 71
码小白l
这个作者很懒,什么都没留下…
展开
-
go编译过程
源代码——编译器前端——优化器——编译器后端——目标程序编译器前端主要专注于理解源程序、扫描解析源程序并进行精准的语义表达。编译器的中间阶段(Intermediate Representation,IR)可能有多个,编译器会使用多个IR阶段、多种数据结构表示代码,并在中间阶段对代码进行多次优化。例如,识别冗余代码、识别内存逃逸等。编译器的中间阶段离不开编译器前端记录的细节。编译器后端专注于生成特定目标机器上的程序,这种程序可能是可执行文件,也可能是需要进一步处理的中间形态obj文件、汇编语言等。原创 2024-10-20 19:49:13 · 1028 阅读 · 0 评论 -
Golang容器:Channel
是Go语言中一种强大的通信机制,它使得在并发运行的goroutines之间可以高效地交换数据。原创 2024-05-30 10:32:22 · 1050 阅读 · 0 评论 -
Golang容器:切片
如超出cap限制,由于数组长度的不变性,当涉及底层数组大小无法满足要求时,会创建新的数组。append()函数执行时,会首先将传入的切片参数复制一份,生成一个新的切片,动态分配大小连续的空间,切⽚是引⽤类型,当将⼀个切⽚赋值给另⼀个切⽚时,它们引⽤的是相同的底层数组。在 Go 1.18 之前的版本中,切片扩容遵循的策略是:对于容量小于 1024 个元素的切片,扩容时容量翻倍;从 Go 1.18 版本开始,Go 语言对切片扩容策略进行了优化,以更高效地处理大容量切片的扩容问题,减少内存分配和拷贝的开销。原创 2024-05-23 21:44:39 · 639 阅读 · 0 评论 -
Golang容器:map
map(映射)是一种用于存储key-value(键-值对)的数据结构。与切片中存储元素的有序性相比,map中的key-value是无序的。map的主要优势在于可以根据key来快速查找对应的value。读、写、删时间复杂度O(1)若目标元素不存在,则返回零值(数据类型不同,对应的零值会有不同)。那么,对于返回零值的场景,便可能存在两种情况:一是key对应的元素不存在;二是key对应的元素存在,其值就是零值。这就是map查找中的二义性。原创 2024-05-23 21:42:35 · 1495 阅读 · 0 评论 -
Golang设计模式(四):观察者模式
观察者模式(Observer Pattern):定义对象之间的一种一对多依赖关系,使得每当一个对象状态发生改变时,其相关依赖对象皆得到通知并被自动更新。观察者模式的别名包括发布-订阅(Publish/Subscribe)模式、模型-视图(Model/View)模式、源-监听器(Source/Listener)模式或从属者(Dependents)模式。观察者模式是一种对象行为型模式。原创 2024-05-22 09:00:00 · 1046 阅读 · 0 评论 -
Golang设计模式(三):适配器模式
适配器模式(Adapter Pattern):将一个接口转换成客户希望的另一个接口,使接口不兼容的那些类可以一起工作,其别名为包装器(Wrapper)。适配器模式既可以作为类结构型模式,也可以作为对象结构型模式。原创 2024-05-21 20:22:43 · 1123 阅读 · 0 评论 -
代码日记:144. 二叉树的前序遍历,145. 二叉树的后序遍历,94. 二叉树的中序遍历(递归)
递归是一种在函数内部直接或间接调用自身的编程技巧,常处理树结构和分治问题。原创 2024-05-19 22:50:18 · 185 阅读 · 0 评论 -
Golang设计模式(一)简单工厂 工厂方法 抽象工厂
在简单工厂模式下只提供一个工厂类,该工厂处于对产品类进行实例化的中心位置,它需要知道每个产品对象的创建细节,并决定何时实例化哪个产品类,当有新产品加入时,必须修改工厂类工厂方法模式:定义一个用于创建对象的接口,让子类决定将哪个类实例化。不再提供一个统一的工厂类来创建所有的产品对象,针对不同的产品提供不同的工厂。提供一个抽象工厂接口来声明抽象工厂方法,而由其子类来具体实现工厂方法,创建具体的产品对象。适用于需要将对象创建过程封装起来,同时提供系统扩展性的场景。产品等级结构产品等级结构即产品的继承结构产品族。原创 2024-05-19 10:00:00 · 1035 阅读 · 0 评论 -
设计模式总述
设计模式(Design Pattern)是一套被反复使用、多数人知晓的、经过分类编目的、代码设计经验的总结,使用设计模式是为了可重用代码、让代码更容易被他人理解并且保证代码可靠性。设计模式:可复用面向对象软件的基础》一书中所介绍的23种经典设计模式。原创 2024-05-19 10:00:00 · 366 阅读 · 0 评论 -
代码日记:15. 三数之和
【代码】代码日记:15. 三数之和。原创 2024-05-18 21:15:00 · 149 阅读 · 0 评论 -
代码日记:383. 赎金信
【代码】代码日记:383. 赎金信。原创 2024-05-18 21:15:00 · 210 阅读 · 0 评论 -
代码日记:1. 两数之和,167. 两数之和 II - 输入有序数组
双指针通常适用于解决数组、链表等数据结构中,需要对数组中的值进行比较、查找、或者夹逼等操作的场景。双指针可以从数组的两端向中间移动,根据题目条件进行夹逼,从而得到满足条件的解。它在解决数组和链表中的很多问题时都有较高的效率。哈希表通常适用于需要对数据的存储、查找、在一定范围内计数等操作的场景。通过将数组中的值存入哈希表并建立索引,可以加速数据查找和计数的过程。它在解决元素重复、查找元素、计数等问题时具有很大的优势。原创 2024-05-18 16:27:20 · 702 阅读 · 0 评论 -
代码日记: 454. 四数相加 II
然后,我们再次遍历数组nums3和nums4,计算两数之和,并在哈希表countAB中查找相反数的和,同时累加匹配的次数。首先,我们遍历数组nums1和nums2,计算两数之和,并将结果存储在哈希表countAB中,同时记录每个和出现的次数。最后,返回满足条件的次数作为结果。原创 2024-05-18 15:39:00 · 189 阅读 · 0 评论 -
代码日记:18. 四数之和
使用双指针加固定循环的方法。在处理排序后的数组时,可能会存在重复的元素,如果不进行特殊处理,会导致在结果中出现重复的四元组。因此,我们需要在固定两个数时对重复的元素进行skip,确保最终结果中的四元组不会重复。,当当前的i大于0(即i已经不是数组的第一个元素),并且当前的nums[i]等于前一个元素nums[i-1]时,我们就可以认定当前的nums[i]和前一个元素重复了,此时我们应该跳过当前元素,以避免在后续的计算中出现重复的情况。j的循环也一样的判断。原创 2024-05-18 15:22:23 · 507 阅读 · 0 评论 -
Golang设计模式(二):单例模式
优点:在程序启动时立即创建实例,因此不存在线程安全问题,无需加锁,避免了同步控制带来的性能开销。缺点:由于实例在程序加载时即创建,即使该实例未被使用,也会导致资源的提前占用和浪费,不适用于按需创建的场景。适用场景:适合对性能要求高且实例使用频率高的场景。原创 2024-05-19 10:00:00 · 1682 阅读 · 0 评论 -
Viper介绍
Viper是一个专门为Go语言开发的配置解决方案。它不仅提供了一种简单而直观的方式来处理配置信息,而且它的功能强大且灵活,可以满足各种复杂的配置需求。Viper特别适合于Go项目的配置管理,无论项目大小,都可以轻松应对。最重要的是,它支持多种配置文件格式,包括但不限于JSON、YAML、TOML等,这意味着你可以根据项目的具体需求选择最适合的格式。原创 2024-04-12 22:05:47 · 490 阅读 · 0 评论 -
JWT介绍
JSON Web Token (JWT) 是一种开放标准 (RFC 7519),提供一种简洁且自包含的方式,以JSON形式在通信双方间传递信息。这些信息可通过数字签名进行验证,确保其可信度。JWT 可以使用密钥(HMAC)或 RSA 或 ECDSA 的公钥/私钥对进行签名。虽然JWT可以加密以提供私密消息,但我们一般指的是已签名的 tokens。原创 2024-04-12 17:34:39 · 1094 阅读 · 0 评论 -
Gin框架(3)
如果你需要更详细的日志记录或想要使用不同的日志库,你可以创建自定义的日志中间件。import ("log""net/http""time"// 访问开始时间// 处理请求c.Next()// 访问结束时间// 访问耗时// 记录日志})在这个例子中,我们定义了一个requestLogger函数,它会在每个请求处理之前记录客户端IP、请求方法、请求路径、状态码和处理请求的耗时。然后,我们通过r.Use(requestLogger)将这个日志中间件添加到Gin路由器中。原创 2024-04-03 12:07:06 · 1310 阅读 · 0 评论 -
Gin框架入门(1)
Gin提供了多种路由定义方式,可以定义参数路由、查询字符串路由、通配符路由等。在Gin中,使用HTTP方法函数定义路由,支持等多种HTTP方法。路由路径支持参数通配符定义,语法与标准库http包一致。r.GET("/path", handleFunc) // 不带参数路由r.GET("/path/*name", func(c *gin.Context){...}) // 参数路由r.GET("/path", func(c *gin.Context){...}) // 查询字符串?key=value。原创 2024-03-11 20:49:44 · 578 阅读 · 0 评论 -
GROM学习
Go 语言 ORM(对象关系映射)库,它提供了一种高效、简洁的方式来操作数据库。通过将数据库表映射为 Go 语言的结构体,GORM 让数据库操作变得更加直观和类型安全。GORM 支持主流的数据库系统,包括 MySQL、PostgreSQL、SQLite 和 SQL Server 等GORM 提供了一系列的 API 来操作 MySQL 数据库。原创 2024-03-26 09:12:07 · 291 阅读 · 0 评论 -
Gin框架(2)
c.Writer提供了最大的灵活性,允许你完全控制响应的生成。和提供了静态文件服务的便捷方法,适用于不同的场景。和c.File提供了在处理函数中发送文件响应的便捷方法,其中允许你指定文件系统。import ("net/http"// 创建一个路由,使用 c.Writer 发送文件// 读取文件内容if err!= nil {return// 设置响应头// 写入文件内容})原创 2024-03-29 11:15:06 · 765 阅读 · 0 评论 -
RESTful风格
是一种软件架构风格,它定义了一组约束和原则,用于创建Web服务。REST(Representational State Transfer,表述性状态转移),目的是描述一组架构原则,以实现软件系统的可伸缩性。RESTful Web服务遵循这些原则,使得它们具有无状态、可缓存、统一接口等特点。原创 2024-03-21 11:12:25 · 625 阅读 · 0 评论 -
GO mod使用
go mod 入门原创 2023-05-07 14:03:20 · 1034 阅读 · 0 评论