
go
文章平均质量分 83
golang
daemon365
https://daemon365.cnblogs.com/
展开
-
go redis
【代码】go redis。原创 2024-06-16 18:24:32 · 230 阅读 · 0 评论 -
golang sqlx
在项目中我们通常可能会使用连接MySQL数据库。sqlx可以认为是Go语言内置的超集,它在优秀的内置基础上提供了一组扩展。这些扩展中除了大家常用来查询的和外还有很多其他强大的功能。原创 2024-06-15 16:16:21 · 644 阅读 · 0 评论 -
行为模式
收到请求后, 每个处理者均可对请求进行处理, 或将其传递给链上的下个处理者。一个对象的改变会触发其它观察者的相关动作,而此对象无需关心连动对象的具体实现。此处需要注意:因为父类需要调用子类方法,所以子类需要匿名组合父类的同时,父类需要持有子类的引用。它能让你定义一系列算法, 并将每种算法分别放入独立的类中, 以使算法的对象能够相互替换。中介者模式封装对象之间互交,使依赖变的简单,并且使复杂互交简单化,封装在中介者中。解释器模式的意义在于,它分离多种复杂功能的实现,每个功能只需关注自身的解释。原创 2024-06-06 10:11:07 · 797 阅读 · 0 评论 -
结构型模式
比如要发消息,可以发很多种方式,微信、qq、email、短信等等,也可以发很多类型,日常、紧急等的。享元模式从对象中剥离出不发生改变且多个实例需要的重复数据,独立出一个享元,使多个对象共享,从而节省内存以及减少对象数量。组合模式常用于树状结构,用于统一叶子节点和树节点的访问,并且可以用于应用某一操作到所有子节点。API 为facade 模块的外观接口,大部分代码使用此接口简化对facade类的访问。组合模式统一对象和对象集,使得使用相同接口使用对象和对象集。策略模式使抽象部分和实现部分分离,可以独立变化。原创 2024-06-06 10:10:32 · 384 阅读 · 0 评论 -
创建者模式
抽象工厂模式则是针对的多个产品等级结构, 我们可以将一种产品等级想象为一个产品族,所谓的产品族,是指位于不同产品等级结构中功能相关联的产品组成的家族。原型模式配合原型管理器使用,使得客户端在不知道具体类的情况下,通过接口管理器得到新的实例,并且包含部分预设定配置。原型模式使对象能复制自身,并且暴露到接口中,使客户端面向接口编程时,不知道接口实际对象的情况下生成新的对象。我们在创建对象时不会对客户端暴露创建逻辑,并且是通过使用一个共同的接口来指向新创建的对象。比如一些可以复用一个连接的网络,比如。原创 2024-06-05 11:06:32 · 487 阅读 · 0 评论 -
http 和 https
为了解决上述HTTP存在的问题,就用到了HTTPS。HTTPS 协议(HyperText Transfer Protocol over Secure Socket Layer):一般理解为HTTP+SSL/TLS,通过 SSL证书来验证服务器的身份,并为浏览器和服务器之间的通信进行加密。那么SSL又是什么?SSL(Secure Socket Layer,安全套接字层):1994年为 Netscape 所研发,SSL 协议位于 TCP/IP 协议与各种应用层协议之间,为数据通讯提供安全支持。原创 2024-06-04 09:55:01 · 425 阅读 · 0 评论 -
go net/http 和 gin 路由
调用实例化server调用server的调用server的Serve方法,开启for循环,在循环中Accept请求对每一个请求实例化一个Conn,并且开启一个goroutine为这个请求进行服务读取每个请求的内容调用的,如果handler为空,就把handler设置为系统默认的路由器调用handler的=>实际上是调用了的在中会调用路由对应处理handler在路由对应处理handler中会执行sayHello()有一个需要注意的点:和路由对应的处理方法handler都实现了ServeHTTP。原创 2024-06-04 09:53:07 · 1067 阅读 · 0 评论 -
go 命令行工具 cobra
它包含一个用于创建功能强大的现代 CLI 应用程序的库,以及一个用于快速生成基于 Cobra 的应用程序和命令文件的工具。命令是应用程序的核心。应用程序提供的每一个交互都包含在 Command 中。一个命令可以有子命令和可选的运行一个动作。库提供的,该库是一个标准库的 fork,在维护相同接口的基础上兼容了。Cobra 命令可以定义一直保留到子命令的标志和仅可用于该命令的标志。一个标志是一种修饰命令行为的方式。结构体的字段,用于定义命令行工具的行为和选项。是个结构体,有很多字段,都是做什么用的呢?原创 2024-06-03 10:45:01 · 741 阅读 · 0 评论 -
go gin 框架介绍及使用
基于httprouter开发的Web框架。中文文档,齐全。简单易用的轻量级框架。原创 2024-06-03 10:44:17 · 633 阅读 · 0 评论 -
go HTML 标签提取器 soup
类似python中beatifulsoup,用于提取html标签提取,多用于爬虫。它可以很好的处理不规范标记并生成剖析树(parse tree)。它提供简单又常用的导航,搜索以及修改剖析树的操作。利用它我们不在需要编写正则表达式就可以方便的实现网页信息的提取。soup是一个小型的网页提取包,其接口与beauthoulsoup非常相似。原创 2024-06-02 12:29:22 · 1265 阅读 · 0 评论 -
go zap 高性能日志
日志在整个工程实践中的重要性不言而喻,在选择日志组件的时候也有多方面的考量。详细、正确和及时的反馈是必不可少的,但是整个性能表现是否也是必要考虑的点呢?在长期的实践中发现有的日志组件对于计算资源的消耗十分巨大,这将导致整个服务成本的居高不下。此文从设计原理深度分析了 zap 的设计与实现上的权衡,也希望整个的选择、考量的过程能给其他的技术团队在开发高性能的 Go 组件时带来一定的借鉴意义。日志作为整个代码行为的记录,是程序执行逻辑和异常最直接的反馈。对于整个系统来说,日志是至关重要的组成部分。原创 2024-06-02 12:28:52 · 2599 阅读 · 0 评论 -
go viper 配置管理
(译注:因为Viper支持从多种配置来源,例如磁盘上的配置文件>命令行标志位>环境变量>远程Key/Value存储>默认值,我们在查找一个配置的时候如果在当前配置源中没找到,就会继续从后续的配置源查找,直到找到为止。如果你希望在Get()调用中使用-或者其他什么符号,但是环境变量里使用_分隔符,那么这个功能是非常有用的。这里用一个demo演示如何在gin框架搭建的web项目中使用viper,使用viper加载配置文件中的信息,并在代码中直接使用viper.GetXXX()方法获取对应的配置值。原创 2024-06-01 15:33:05 · 800 阅读 · 0 评论 -
go jwt
JWT全称JSON Web Token是一种跨域认证解决方案,属于一个开放的标准,它规定了一种Token实现方式,目前多用于前后端分离项目和OAuth2.0业务场景下。原创 2024-06-01 15:32:34 · 320 阅读 · 0 评论 -
go mod
go module是 Go1.11版本之后官方推出的版本管理工具,并且从Go1.13版本开始,go module将是Go语言默认的依赖管理工具。原创 2024-05-31 10:10:03 · 408 阅读 · 0 评论 -
go 模板 html/template与text/template
执行模板时,函数从两个函数字典中查找:首先是模板函数字典,然后是全局函数字典。一般不在模板内定义函数,而是使用Funcs方法添加函数到模板里。and函数返回它的第一个empty参数或者最后一个参数;就是说"and x y"等价于"if x then y else x";所有参数都会执行;or返回第一个非empty参数或者最后一个参数;亦即"or x y"等价于"if x then x else y";所有参数都会执行;not返回它的单个参数的布尔值的否定len。原创 2024-05-31 10:09:31 · 447 阅读 · 0 评论 -
go context 包
比如我们新建了一个基于 context.Background() 的 ctx1,携带了一个 map 的数据,map 中包含了 “k1”: “v1” 的一个键值对,ctx1 被两个 goroutine 同时使用作为函数签名传入,如果我们修改了 这个map,会导致另外进行读 context.Value 的 goroutine 和修改 map 的 goroutine,在 map 对象上产生 data race。在将 context 集成到 API 中时,要记住的最重要的一点是,它的作用域是请求级别 的。原创 2024-05-30 10:24:19 · 759 阅读 · 0 评论 -
go net/http 包
Client和Transport类型都可以安全的被多个goroutine同时使用。出于效率考虑,应该一次建立、尽量重用。原创 2024-05-30 10:23:38 · 881 阅读 · 0 评论 -
go fmt 包
fmt.Scanf不同于fmt.Scan简单的以空格作为输入数据的分隔符,fmt.Scanf为输入数据指定了具体的输入内容格式,只有按照格式输入数据才会被扫描并存入对应变量。这几个函数功能分别类似于fmt.Scan、fmt.Scanf、fmt.Scanln三个函数,只不过它们不是从标准输入中读取数据而是从io.Reader中读取数据。Go语言fmt包下有fmt.Scan、fmt.Scanf、fmt.Scanln三个函数,可以在程序运行过程中从标准输入获取用户的输入。标准库fmt提供了以下几种输出相关函数。原创 2024-05-29 11:32:15 · 1003 阅读 · 0 评论 -
go time 包
时间类型有一个自带的方法Format进行格式化,需要注意的是Go语言中格式化时间模板不是常见的Y-m-d H:M:S而是使用Go的诞生时间2006年1月2号15点04分。使用time.Tick(时间间隔)来设置定时器,定时器的本质上是一个channel。使用time.Unix()函数可以将时间戳转为时间格式。time.Time类型表示时间。原创 2024-05-29 11:31:29 · 227 阅读 · 0 评论 -
go map 实现原理
维基百科里这样定义 map:简单说明一下:在计算机科学里,被称为相关数组、map、符号表或者字典,是由一组对组成的抽象数据结构,并且同一个 key 只会出现一次。有两个关键点:map 是由key-value对组成的;key只会出现一次。增加一个 k-v 对 —— Add or insert;删除一个 k-v 对 —— Remove or delete;修改某个 k 对应的 v —— Reassign;查询某个 k 对应的 v —— Lookup;简单说就是最基本的增删查改。原创 2024-05-28 21:41:47 · 793 阅读 · 0 评论 -
golang net/http 源码解析
这个细节是十分重要的,因为这一步关乎到当路由规则匹配时,相应的响应方法是否会被调用的问题!就可以执行到相应的处理方法了,这个处理方法实际上就是我们刚开始定义的。,也就是底层用TCP协议搭建了一个服务,然后监控我们设置的端口。表示这个路由规则对应的处理方法,并且这个处理方法有两个参数。就可以理解为是我们自定义的路由器),就会使用系统默认的。OK,这部分代码做的事就这么多,第一部分结束。这个方法时,系统就会给我们指派一个路由器,代码挺多,其实主要就做了一件事,向。方法,但是方法要达到的目的不同,在。原创 2024-05-28 21:40:39 · 930 阅读 · 0 评论 -
go channel 原理
channel一个类型管道,通过它可以在goroutine之间发送和接收消息。它是Golang在语言层面提供的goroutine间的通信方式。众所周知,Go依赖于称为CSP(Communicating Sequential Processes)的并发模型,通过Channel实现这种同步模式。Go并发的核心哲学是不要通过共享内存进行通信;相反,通过沟通分享记忆。下面以简单的示例来演示Go如何通过channel来实现通信。原创 2024-05-28 21:40:04 · 1029 阅读 · 0 评论 -
go channel
channels 是一种类型安全的消息队列,充当两个 goroutine 之间的管道,将通过它同步的进行任意资源的交换。chan 控制 goroutines 交互的能力从而创建了 Go 同步机制。当创建的 chan 没有容量时,称为无缓冲通道。反过来,使用容量创建的 chan 称为缓冲通道。要了解通过 chan 交互的 goroutine 的同步行为是什么,我们需要知道通道的类型和状态。根据我们使用的是无缓冲通道还是缓冲通道,场景会有所不同,所以让我们单独讨论每个场景。原创 2024-05-28 21:39:32 · 605 阅读 · 0 评论 -
go error 错误处理
go语言error是一普通的值,实现方式为简单一个接口。创建error使用s stringreturn e.s返回的是errorString结构体 实现了error接口的Error()方法使用创建创建方式为把字符串拼接起来,然后调用errors.New().Packages that are reusable across many projects only return root error values.(选择 wrap error 是只有 applications 可以选择应用的策略。原创 2024-05-28 21:38:50 · 692 阅读 · 0 评论 -
go GC 垃圾回收机制
以上便是Golang的GC全部的标记-清除逻辑及场景演示全过程。GoV1.3- 普通标记清除法,整体过程需要启动STW,效率极低。GoV1.5- 三色标记法, 堆空间启动写屏障,栈空间不启动,全部扫描之后,需要重新扫描一次栈(需要STW),效率普通GoV1.8-三色标记法,混合写屏障机制, 栈空间不启动,堆空间启动。整个过程几乎不需要STW,效率较高。原创 2024-05-28 10:58:16 · 1212 阅读 · 0 评论 -
go 反射
反射是指在程序运行期对程序本身进行访问和修改的能力。程序在编译时,变量被转换为内存地址,变量名不会被编译器写入到可执行部分。在运行程序时,程序无法获取自身的信息。支持反射的语言可以在程序编译期将变量的反射信息,如字段名称、类型信息、结构体信息等整合到可执行文件中,并给程序提供接口访问反射信息,这样就可以在程序运行期获取类型的反射信息,并且有能力修改它们。Go程序在运行期使用reflect包访问程序的反射信息。在上一篇博客中我们介绍了空接口。原创 2024-05-28 10:57:24 · 800 阅读 · 0 评论 -
go 文件系统
但是使用该方法时需要预先分配空间,用于存储读取的文件内容。向文件中写入时,如果文件存在,文件会先被清空,然后再写入。如果文件不存在,就会以。删除文件前确保文件没有被其他程序使用。如果文件不存在,就会返回错误,如果存在就以只读的方式打开文件。是以只读的方式打开文件,无法向文件写入数据。如果文件已经存在,那么该函数就会返回错误。方法,这样能够保证函数退出时文件能被关闭。打开文件,达到不存在就新建,存在就清空(以追加的方式打开文件。当然,也可以不清空文件(权限先创建文件,然后再写入。读取文件内容可以使用。原创 2024-05-28 10:56:30 · 326 阅读 · 0 评论 -
go 单元测试
go testgo test命令是一个按照一定的约定和组织来测试代码的程序。在包目录内,所有以_test.go为后缀名的源文件在执行go build时不会被构建成包的一部分,它们是go test测试的一部分。go test命令会遍历所有的*_test.go文件中符合上述命名规则的函数,生成一个临时的main包用于调用相应的测试函数,接着构建并运行、报告测试结果,最后清理测试中生成的临时文件。在*_test.go文件中有三种类型的函数,单元测试函数、基准测试函数和示例函数。类型格式作用原创 2024-05-27 21:15:48 · 608 阅读 · 0 评论 -
go 并发
默认情况下,channel接收和发送数据都是阻塞的,除非另一端已经准备好,这样就使得Goroutines同步变的更加的简单,而不需要显式的lock。我们上面介绍的都是只有一个channel的情况,那么如果存在多个channel的时候,我们该如何操作呢,Go里面提供了一个关键字select,通过select可以监听channel上的数据流动。select默认是阻塞的,只有当监听的channel中有发送或接收可以进行时才会运行,当多个channel都准备好的时候,select是随机的选择一个执行的。原创 2024-05-27 21:15:04 · 777 阅读 · 0 评论 -
go 包和命令工具
任何包系统设计的目的都是为了简化大型程序的设计和维护工作,通过将一组相关的特性放进一个独立的单元以便于理解和更新,在每个单元更新的同时保持和程序中其它单元的相对独立性。这种模块化的特性允许每个包可以被其它的不同项目共享和重用,在项目范围内、甚至全球范围统一的分发和复用。每个包一般都定义了一个不同的名字空间用于它内部的每个标识符的访问。每个名字空间关联到一个特定的包,让我们给类型、函数等选择简短明了的名字,这样可以在使用它们的时候减少和其它部分名字的冲突。原创 2024-05-27 21:14:19 · 952 阅读 · 0 评论 -
go interface
接口类型是对其它类型行为的抽象和概括;因为接口类型不会和特定的实现细节绑定在一起,通过这种抽象的方式我们可以让我们的函数更加灵活和更具有适应能力。很多面向对象的语言都有相似的接口概念,但Go语言中接口类型的独特之处在于它是满足隐式实现的。也就是说,我们没有必要对于给定的具体类型定义所有满足的接口类型;简单地拥有一些必需的方法就足够了。这种设计可以让你创建一个新的接口类型满足已经存在的具体类型却不会去改变这些类型的定义;当我们使用的类型来自于不受我们控制的包时这种设计尤其有用。原创 2024-05-27 21:13:47 · 439 阅读 · 0 评论 -
go 方法
Go语言只有一种控制可见性的手段:大写首字母的标识符会从定义它们的包中被导出,小写字母的则不会。当调用一个函数时,会对其每一个参数值进行拷贝,如果一个函数需要更新一个变量,或者函数的其中一个参数实在太大我们希望能够避免进行这种默认的拷贝,这种情况下我们就需要用到指针了。调用时p为person的结构体对象,SayHello是People结构体指针的方法,在go中可以直接调用,亦可以(&p).SayHello()这个附加的参数会将该函数附加到这种类型上,即相当于为这种类型定义了一个独占的方法。原创 2024-05-27 21:11:59 · 346 阅读 · 0 评论 -
go 方法
Go语言只有一种控制可见性的手段:大写首字母的标识符会从定义它们的包中被导出,小写字母的则不会。当调用一个函数时,会对其每一个参数值进行拷贝,如果一个函数需要更新一个变量,或者函数的其中一个参数实在太大我们希望能够避免进行这种默认的拷贝,这种情况下我们就需要用到指针了。调用时p为person的结构体对象,SayHello是People结构体指针的方法,在go中可以直接调用,亦可以(&p).SayHello()这个附加的参数会将该函数附加到这种类型上,即相当于为这种类型定义了一个独占的方法。原创 2024-05-27 21:11:07 · 224 阅读 · 0 评论 -
go 函数
如果在deferred函数中调用了内置函数recover,并且定义该defer语句的函数发生了panic异常,recover会使程序从panic中恢复,并返回panic value。在Go中有一部分函数总是能成功的运行,对各种可能的输入都做了良好的处理,使得运行时几乎不会失败,除非遇到灾难性的、不可预料的情况,比如运行时的内存溢出。在Go中,函数被看作第一类值(first-class values):函数像其他值一样,拥有类型,可以被赋值给其他变量,传递给函数,从函数返回。函数类型的零值是nil。原创 2024-05-27 21:10:36 · 897 阅读 · 0 评论 -
go 复杂数据结构
指针指向第一个slice元素对应的底层数组元素的地址,要注意的是slice的第一个元素并不一定就是数组的第一个元素。,其中所有的key都是不同的,然后通过给定的key可以在常数时间复杂度内检索、更新或删除对应的value。它可以用有效可读的方式表示第三章的基础数据类型和本章的数组、slice、结构体和map等聚合数据类型。如果结构体的全部成员都是可以比较的,那么结构体也是可以比较的,那样的话两个结构体将可以使用或!**Map的迭代顺序是不确定的,并且不同的哈希函数实现可能导致不同的遍历顺序。原创 2024-05-27 21:10:01 · 893 阅读 · 0 评论 -
go 基础类型
常量不可改变,一个常量的声明也可以包含一个类型和一个值,但是如果没有显式指明类型,那么将从右边的表达式推断类型。在一个const声明语句中,在第一个声明的常量所在的行,iota将会被置为0,然后在每一个有常量声明的行加一。如果是批量声明的常量,除了第一个外其它的常量右边的初始化表达式都可以省略,如果省略初始化表达式则表示使用前面常量的初始化表达式写法,对应的常量类型也一样的。这两个名称可以互换使用。如果要表示中文,显然一个字节是不够的,至少需要两个字节,而且还不能和ASCII编码冲突,所以,中国制定了。原创 2024-05-27 21:05:43 · 833 阅读 · 0 评论 -
go 基础结构
Go语言中的函数名、变量名、常量名、类型名、语句标号和包名等所有的命名,都遵循一个简单的命名规则:一个名字必须以一个字母(Unicode字母)或下划线开头,后面可以跟任意数量的字母、数字或下划线.大写字母和小写字母是不同的:heapSort和Heapsort是两个不同的名字.Go语言的关键字有25个,关键字不能用于自定义名字. 分别为:还有大约30多个预定义的名字,这些内部预先定义的名字并不是关键字,你可以在定义中重新使用它们。在一些特殊的场景中重新定义它们也是有意义的,但是也要注意避免过度而引起语义混乱原创 2024-05-27 21:02:38 · 853 阅读 · 0 评论