
GO语言
文章平均质量分 56
GO语言的基础及相关知识
wzbwzt
这个作者很懒,什么都没留下…
展开
-
Apisix的ext-plugin-pre-req 中的trace 关联zipkin插件的trace
apisix 链路追踪原创 2022-09-20 20:29:31 · 820 阅读 · 1 评论 -
go container/heap源码解析
//heap的接口类:使用时候需要实现它的方法type Interface interface { sort.Interface Push(x any) // add x as element Len() Pop() any // remove and return element Len() - 1.}//shifDown()//堆化(heapify):如果一个节点比它的子节点小(最大堆)或者大(最小堆),那么需要将它向下移动func down(h Interface, i0, n.原创 2022-04-16 15:53:11 · 510 阅读 · 0 评论 -
Go 工程化标准实践
Go 工程化标准实践本文参考 Go 微服务框架 go-kratos/kratos的项目结构及相关最佳实践标准项目结构/cmd|-- cmd |-- demo |-- demo +-- main.go +-- demo1 |-- demo1 +-- main.go项目的主干,每个应用程序目录名与可执行文件的名称匹配。该目录不应放置太多代码。/internal|-- internal +-- demo原创 2022-04-10 14:33:59 · 1098 阅读 · 0 评论 -
分布式锁实现(基于etcd)
地址:github.com/wzbwzt/dlock下载库:go get -u github.com/wzbwzt/dlock使用事例:etcd := etcd.NewRegister(etcd.WithTimeOut(time.Second * 5))lock := dlock.NewDlock(dlock.WithRegister(etcd))//获取etcd的客户端// etcdclient:=etcd.GetEtcdClient()path := "/lock/a"lock.L原创 2022-03-18 13:00:10 · 397 阅读 · 0 评论 -
go1.18发布
20220316凌晨,Go 1.18 发布了。Go 1.18 是一个大型版本,其中包括新功能、性能改进以及对该语言的最大更改。毫不夸张地说,Go 1.18 的部分设计始于十多年前第一次发布 Go 时。所以,Go1.18 原计划 2 月份发布,结果拖到了 3 月中旬。具体来说,包含以下几大特性:泛型模糊测试(Fuzzing)工作空间(Workspaces)20% 性能提升:Apple M1、ARM64 和 PowerPC64 用户开心了!由于 Go 1.17 的寄存器 ABI 调用约定扩展到这些原创 2022-03-16 14:45:00 · 204 阅读 · 0 评论 -
图片base64格式解析
//base64格式解析,返回后缀,和解析结果func GetPictureFormat(imageData string) (string, []byte, error) { //如果有,去掉头部信息 idx := strings.Index(imageData, ",") if idx > -1 { imageData = imageData[idx+1:] } //替换回车 imageData = strings.ReplaceAll(imageData, "\n", "")原创 2021-11-02 15:05:21 · 2773 阅读 · 0 评论 -
Go基础学习-main包拆分为多个文件
前言:当将main拆分为多个文件时,在main.go中编写了main函数,main函数调用了在其他文件中定义的函数或变量,执行go run main.go 时报错:变量/函数未定义;目录结构:main---main.go---print.go将Go的main包拆分为多个文件的写法和普通包是完全一致的,其使用规则也相同;但是当运行go run mian.go时报错,这时需要将main包相关的所有文件都显式的列出;go run main.go print.go ##部分go版本支持go原创 2021-07-13 10:25:39 · 1644 阅读 · 0 评论 -
GO 编码windows二进制文件,执行时区报错问题解决
问题描述需要编译在windows下的可执行文件,当程序跑起来时时区错误解决方法确保go版本不可以过低;最好是1.15版本以上执行命令GOOS=windows GOARCH=amd64 go build -v -tags timetzdata或者设置环境变量ZONEINFO,指向$GOROOT/lib/time/zoneinfo.zip;也可以代码设置环境变量 err := syscall.Setenv("ZONEINFO", `C:\Go\lib\time\zoneinfo.zip`) if原创 2021-05-29 18:40:05 · 727 阅读 · 0 评论 -
RabbitMQ实现发布订阅
发布订阅与工作队列恰恰相反:工作队列是每条消息只有一个消费者,不存在一个任务被多个worker领取;发布订阅是将向多个消费者传递一个消息,一条消息被多次消费Exchanges(交换器)完整的消息传递模型:核心思想是生产者从不将任何消息直接发送到队列。实际上,生产者经常甚至根本不知道是否将消息传递到任何队列。相反,生产者只能将消息发送到交换器。交换器是非常简单的东西。一方面,它接收来自生产者的消息,另一方面,将它们推入队列。交换器必须确切知道如何处理接收到的消息。它应该被附加到特定的队列吗?还原创 2021-04-20 18:50:29 · 966 阅读 · 0 评论 -
RabbitMQ实现工作队列
RabbitMQ是一个消息代理:它接受并转发消息。使用RabbbitMQ实现工作队列功能:使用任务队列的优点之一是能够轻松并行化工作。如果我们的工作正在积压,我们可以增加更多的工人,这样就可以轻松扩展。消息分发默认情况下,RabbitMQ将按顺序将每个消息发送给下一个消费者。平均而言,每个消费者都会收到相同数量的消息。这种分发消息的方式称为轮询。也可以设置告诉RabbitMQ不要一次向一个worker发出多个消息。或者,换句话说,在处理并确认前一条消息之前,不要向worker发送新消息。相反,原创 2021-04-20 18:41:30 · 502 阅读 · 0 评论 -
JWT跨域认证
摘要JWT(JSON Web Token):一种跨域认证解决方案,属于一个开放的标准,它规定了一种Token实现方式,多用于OAuth2.0业务场景下;(OAuth2.0:授权机制,用来授权第三方应用,获取用户数据,详见:)Cookie-Session验证方式:用户在浏览器端填写用户名和密码,并发送给服务端服务端对用户名和密码校验通过后会生成一份保存当前用户相关信息的session数据和一个与之对应的标识(通常称为session_id)服务端返回响应时将上一步的session_id写入用户浏原创 2021-04-15 18:58:13 · 918 阅读 · 0 评论 -
协程池的设计及代码
协程池的设计Created: Mar 13, 2020 4:57 PMSub-Tags: 发布Tags: WorkUpdated: Mar 13, 2021 6:03 PM前言: 尽管go官方宣称用golang写并发程序的时候随便起个成千上万的goroutine毫无压力;但是每个协程都会分配最小2k的内存,根据需要进行扩容,最大1G,哪怕最小的2k,当协程数达到一定数量时,内存会暴涨,所带来的就是gc的压力,频繁地进行gc也会给性能带来影响;此外内存暴涨,造成无内存可用时,Go调度器就会阻塞原创 2021-03-13 18:13:28 · 342 阅读 · 0 评论 -
单元测试框架:go convey
前言Welcome to GoConvey, a yummy testing tool for gophers.go convey是一个支持golang的单元测试框架go convey能够自动监控文件修改并启动测试,并可以将测试结果实时输出到Web界面go convey提供了丰富的断言简化测试用例的编写特点:直接与 go test 集成巨大的回归测试套件可读性强的色彩控制台输出完全自动化的 Web UI:桌面提醒(可选);半自动化书写测试用例:http://localhost:808原创 2021-03-10 20:08:34 · 2304 阅读 · 1 评论 -
gRPC接口调试工具-grpcui
Go gRPC 调试工具 -grpcui概述当我们在写 HTTP 接口的时候,使用的是 Postman 进行接口调试,那么在写 gRPC 接口的时候,有没有类似于 Postman 的调试工具呢?当然是有的 ~咱们一起看下 grpcui,源码地址:https://github.com/fullstorydev/grpcui看下官方描述:grpcui is a command-line tool that lets you interact with gRPC servers via a bro原创 2020-10-16 22:44:06 · 3217 阅读 · 0 评论 -
关于在windows下使用cockroach数据报错: ERROR: failed to initialize node: unable to load named timezones
首先windows启动cockroach服务时,路径中不可以有中文;对于报时区错误;可以用Go代码在中设置环境变量,也可以手动设置环境变量再执行在package mainimport ( "fmt" "os/exec" "syscall" "log")func main(){ err:=syscall.Setenv("ZONEINFO",`D:\www\test\zoneinfo.zip`) if err != nil { log.Fatal(err) } cmd:=.原创 2020-08-29 20:41:00 · 399 阅读 · 0 评论 -
gRPC 调试工具 -grpcui
Go gRPC 调试工具 -grpcui概述当我们在写 HTTP 接口的时候,使用的是 Postman 进行接口调试,那么在写 gRPC 接口的时候,有没有类似于 Postman 的调试工具呢?当然是有的 ~咱们一起看下 grpcui,源码地址:https://github.com/fullstorydev/grpcui看下官方描述:grpcui is a command-line tool that lets you interact with gRPC servers via a bro转载 2020-08-09 23:41:03 · 3088 阅读 · 0 评论 -
Go生成二维码
使用github.com/skip2/go-qrcode包import ( "fmt" qrcode "github.com/skip2/go-qrcode" "image/color")func main(){ qrcode.WriteFile("https://blog.youkuaiyun.com/wzb_wzt",qrcode.Medium,256,"./QRcode/demo.png") //自定义设置二维码样式 //生成一个qrcode struct指针 code, _ := qr原创 2020-08-08 22:38:28 · 367 阅读 · 0 评论 -
goEmail发送邮件
使用gopkg.in/gomail.v2,发送邮件func SendMail(mailTo []string,subject string, body string ) error { mailConn := map[string]string { "user": "xxxxxx@xxx.com", "pass": "xxxxx", "host": "smtp.xx.com", "port": "465", } port, _ := st原创 2020-08-08 12:39:59 · 1603 阅读 · 1 评论 -
Go中json、map、struct的转换
json与map、json与struct的转换直接通过encoding/json报的序列化与反序列化就可以实现;但是map转struct可以通过github.com/mitchellh/mapstructure包来实现json相比较转换为map,转换为struct在实际使用中更加方便;map需要通过 key 获取数据,可能出现不存在的 key,为了严谨,需要检查 key 是否存在;相对于结构体的方式,map数据提取不便且不能利用 IDE 补全检查,key 容易写错;json与struct.原创 2020-08-06 18:35:36 · 938 阅读 · 0 评论 -
Go基础学习-defer
defer执行的原则defer延迟函数总是在异常panic或者正常return前返回;defer执行顺序按照先入后出的原则,即先入栈的最后执行;但是会先把参数压入栈,具体执行会在函数结束前当defer函数中存在函数时会先执行里面的函数;defer函数调用的参数当存在闭包时,会从外面拿取该参数的最新的值;defer常常与recover一同使用;用来做异常捕捉后的延迟执行;从而将异常给转换为错误error;看几个案例:案例1:func main() { i := 10 defer fmt原创 2020-08-04 19:56:55 · 308 阅读 · 1 评论 -
后缀算法与中缀算法
中缀算法就是日常计算中用到的类似a+b的算法表达式;运算符位于两个运算数中间的位置;后缀算法相比较中缀表达式的结构,不难推出后缀表达式的格式,就是符号位于两个运算量的后边位置,比如ab+表示的就是a+b;后缀表达式又称逆波兰表达式;优点在于:可以配合栈(stack)来完成运算,这种运算只需要按顺序进行而不需要考虑运算符的优先级,并且速度很快。以后缀表达式:abc+de+;为例,他的运算过程是:1.将a,b先后入栈;2.读取到*,将a、b出栈,计算ab;将结果再入栈;3.将c入栈;读取到+;原创 2020-08-04 14:59:24 · 1637 阅读 · 0 评论 -
判断一个链表是否有环
题目:给定一个链表,判断链表中是否有环。pos 表示链表尾连接到链表中的位置(索引从 0 开始)示例1:输入:head = [3,2,0,-4], pos = 1输出:true解释:链表中有一个环,其尾部连接到第二个节点。示例2:输入:head = [1,2], pos = 0输出:true解释:链表中有一个环,其尾部连接到第一个节点。思路:首先判断head不可以为nil对于head.Next节点为nil的返回false对head做赋值,分别给a和b;让a走两步,b走一步;原创 2020-08-03 17:15:45 · 119 阅读 · 0 评论 -
判断两个链表相交的起始节点
题目:找到两个单链表相交的起始节点;比如:从c1开始相交:输入: listA = [4,1,8,4,5], listB = [5,0,1,8,4,5], 输出: 8思路:首先对于传入的A链、B链判断不能为nil;只要两个节点不相等就循环,知道找到相等的那个节点A、B每次都是走一步,走到头会延续对方的路走,这样他们走的路就是相同的;只要不是平行,必然可以找到那个相交的节点;代码:type ListNode struct { Val int Next *Li原创 2020-08-03 16:58:25 · 232 阅读 · 0 评论 -
Go实现Websocket
WebSocketWebSocket 是独立的、创建在 TCP 上的协议。WebSocket在 HTML5 游戏和网页消息推送都使用比较多。WebSocket 是 HTML5 的重要特性,它实现了基于浏览器的远程socket,它使浏览器和服务器可以进行全双工通信,能更好的节省服务器资源和带宽并达到实时通讯的目的。它与HTTP一样通过已建立的TCP连接来传输数据,但是它和HTTP最大不同是:WebSocket是一种双向通信协议。在建立连接后,WebSocket服务器端和客户端都能主动向对方发送或接收数原创 2020-08-03 12:43:07 · 1591 阅读 · 0 评论 -
Go实现http(net包)
http协议基于Tcp/ip协议;区别在于Tcp是面向连接的,而http是短连接,一次请求对用一次回应服务端http的开启方式1:func f1(w http.ResponseWriter, r *http.Request) { n, err := ioutil.ReadFile("./home.html") if err != nil { w.Write([]byte("页面丢失了!")) } w.Write(n)}//模拟客户端请求;同浏览器func f2(w http.Re原创 2020-08-02 22:04:46 · 251 阅读 · 0 评论 -
Go的错误、异常处理机制
错误和异常的区别错误指的是可能出现问题的地方出现了问题,比如打开一个文件时失败,这种情况在人们的意料之中 ;而异常指的是不应该出现问题的地方出现了问题,比如引用了空指针,这种情况在人们的意料之外。可见,错误是业务过程的一部分,而异常不是 。错误和异常从Golang机制上讲,就是error和panic的区别。Golang错误和异常是的互相转换的:错误转异常,比如程序逻辑上尝试请求某个URL,最多尝试三次,尝试三次的过程中请求失败是错误,尝试完第三次还不成功的话,失败就被提升为异常了。异常原创 2020-08-02 12:08:16 · 460 阅读 · 0 评论 -
Go基础学习-Context
Go中常用的并发模型之一;(一共有三种:通过channel通知实现并发控制;通过sync包中的WaitGroup实现并发控制;Context上下文,实现并发控制)context对goroutine进行跟踪,从而达到控制他们的目的context接口不需要实现,其内置了两个方法帮我们实现了: var ( background = new(emptyCtx) todo = new(emptyCtx) ) func Background() Context..原创 2020-07-30 00:35:52 · 138 阅读 · 0 评论 -
排序的方法
冒泡排序比较相邻的元素。如果第一个比第二个大,就交换它们两个;第一次下来后最大的元素会排在最右边;下一次重复比较时,不会再去判断最后一个元素,以此讲第二大的元素给筛选出来;重复置只需要判断以此为止;func BubbleSort(x []int)[]int{ for i:=0;i<len(x)-1;i++ { for j:=0;j<len(x)-1-i;j++ { if x[j]>x[j+1] { var tmp int tmp=x[j+1]原创 2020-07-28 22:10:32 · 126 阅读 · 0 评论 -
go Logrus库的简单使用和进阶使用
go官方日志库log,功能简单,无法对于更精细的日志级别、日志文件分割以及日志分发等方面并没有提供支持;logrus日志级别分6等级;(debug、info、warn、error、fatal和panic) ;此外logrus与golang标准库日志模块完全兼容,因此可以使用log“github.com/sirupsen/logrus”替换所有日志导入。logrus的简单使用func main(){ //以json的形式输出,默认是以TextFormatter文档的形式输出 log.SetFormat原创 2020-07-25 22:34:23 · 1068 阅读 · 1 评论 -
go 定位函数操作位置(文件名、函数名、所在行)
runtime.Caller()返回函数执行程序计数pc、执行的文件名和所在行数runtime.FuncForPC()传入pc,得到运行的函数指针文件结构- runtime- -file1.go- -file2.go- -main.gomain.go文件package mainimport ( "fmt" "path" "runtime")func main(){ name, funcName, line := f2(0) fmt.Printf("file:%v;fun原创 2020-07-24 21:37:34 · 1089 阅读 · 0 评论 -
go 获取文件执行的路径
方法:path, _ := exec.LookPath(os.Args[0])fmt.Println(path) abs, _ := filepath.Abs(path)fmt.Println(abs)index := strings.LastIndex(abs, string(os.PathSeparator))fmt.Println(path[:index]) os.Args是用来获取命令行执行参数分片当go run 运行时会将文件转移到临时路径下,然后再进行编译和执行,分片0就是原创 2020-07-24 18:14:06 · 2946 阅读 · 0 评论 -
float转二机制数据
需要用到官方的math包和binary包package mainimport ( "encoding/binary" "fmt" "math")func main(){//float32转[]bytevar sf float32 = 12.12bits := math.Float32bits(sf)res:=make([]byte,4)binary.LittleEndian.PutUint32(res,bits)fmt.Printf("%v\n",res) //[133 23原创 2020-07-24 00:15:46 · 179 阅读 · 0 评论 -
区块链的简单代码实现,基于Web服务器的Pow实例
区块(生成创世区块、生成新区块)package blockimport ( "crypto/sha256" "encoding/hex" "math/rand" "strconv" "strings" "time")const Diff =3//区块type Block struct { Index int PreHash string HashCode string TimeStamp int Diff int Data string Nonce int}原创 2020-07-23 16:38:37 · 1450 阅读 · 1 评论 -
gorilla/mux的使用
github.com/gorilla/mux:golang自带的http.SeverMux路由实现简单,本质是一个map[string]Handler,是请求路径与该路径对应的处理函数的映射关系。实现简单功能也比较单一:1.不支持正则路由, 这个是比较致命的2.只支持路径匹配,不支持按照Method,header,host等信息匹配,所以也就没法实现RESTful架构而gorilla/mux是一个强大的路由,小巧但是稳定高效,不仅可以支持正则路由还可以按照Method,header,host等信原创 2020-07-21 13:21:52 · 759 阅读 · 0 评论 -
Go-micro的使用实例
Go-micro创建grpc服务proto文件protoc --go_out=. model.proto //当前文件下生成.go文件protoc --micro_out=. --go_out=. service.proto //当前文件下生成.micro.go文件//model.protosyntax="proto3";package Services;//商品模型message ProdModel{ //@inject_tag:json:"id" int32 Pr原创 2020-07-20 18:12:52 · 934 阅读 · 1 评论 -
Go连接数据库以及sqlx包使用
Mysql使用go自带包"database/sql",连接数据库使用database/sql包时必须注入(至少)一个数据库驱动,mysql使用的是github.com/go-sql-driver/mysql,匿名导入连接//连接func initDB() (err error) { //数据库连接信息:dataSourceName dsn := "root:xxx@tcp(xxx.xxx.xxx.xxx:3306)/go_demo" db, err = sql.Open("mysql",原创 2020-07-20 00:25:04 · 1067 阅读 · 0 评论 -
Go连接Redis
RedisKV 数据库;是一个开源的内存数据库,Redis提供了多种不同类型的数据结构,主要有:1.字符串(strings)2.哈希(hashes)3.列表(lists)4.集合(sets)5.带范围查询的排序集合(sorted sets)6.位图(bitmaps)7.hyperloglogs8.带半径查询和流的地理空间索引等数据结构(geospatial indexes)推荐书单:<<Redis 实战>>import ( "fmt" "github原创 2020-07-19 20:26:18 · 343 阅读 · 0 评论 -
Go实现TCP、UPD连接及粘包问题解决
UDP连接//服务端func main() { udpConn, err := net.ListenUDP("udp", &net.UDPAddr{ IP: net.IPv4(127, 0, 0, 1), Port: 30000, }) if err != nil { fmt.Println("udp listen failed err:", err) return } defer udpConn.Close() var tmp [1024]byte for {原创 2020-07-19 19:53:55 · 738 阅读 · 0 评论 -
pprof性能优化
Go性能优化主要方面CPU profile:报告程序的 CPU 使用情况,按照一定频率去采集应用程序在 CPU 和寄存器上面的数据Memory Profile(Heap Profile):报告程序的内存使用情况Block Profiling:报告 goroutines 不在运行状态的情况,可以用来分析和查找死锁等性能瓶颈Goroutine Profiling:报告 goroutines 的使用情况,有哪些 goroutine,它们的调用关系是怎样的工具型应用使用背景:应用程序是运行一段时间原创 2020-07-18 16:21:22 · 1985 阅读 · 0 评论 -
Go基础学习-使用gopkg.in/ini.v1实现文件解析及手动实现ini文件解析
gopkg.in/ini.v1//配置文件# possible values : production, developmentapp_mode = development[paths]# Path to where grafana can store temp files, sessions, and the sqlite3 db (if that is used)data = /home/git/grafana[server]# Protocol (http or https)pr原创 2020-07-17 23:25:45 · 5103 阅读 · 0 评论