Golang
文章平均质量分 80
qauzy
这个作者很懒,什么都没留下…
展开
-
golang实现Java序列化/反序列化
第一部分是序列化文件头0xACED: magic 声明使用了序列化协议.0x05: version 序列化协议版本.0x73: TC_OBJECT. 声明这是一个新的对象.按顺序获取类描述,类数据块信息,获取第[0]块信息第二部分是序列化的类的描述[深度:0]0x72: TC_CLASSDESC. 声明这里开始一个新Class0x21: 类名字的长度[33]0x636F6D2E6578616D706C652E64656D6F2E6D6F64656C2E55736572456E746974...原创 2022-03-16 00:05:26 · 1190 阅读 · 0 评论 -
【golang源码分析】chan底层原理——附带读写用户队列的环形缓冲区
1 环形缓冲区1.1 环形缓冲区结构 环形缓冲区通常有一个读指针和一个写指针。读指针指向环形缓冲区中可读的数据,写指针指向环形缓冲区中可写的缓冲区。通过移动读指针和写指针就可以实现缓冲区的数据读取和写入。在通常情况下,环形缓冲区的读用户仅仅会影响读指针,而写用户仅仅会影响写指针。如果仅仅有一个读用户和一个写用户,那么不需要添加互斥保护机制就可以保证数据的正确性。如果有多个读写用...原创 2020-02-25 20:07:01 · 1392 阅读 · 0 评论 -
【bilibili kratos】构建环境
1 拉取源码1.1fork自己的分支(方便修改)1.2 构建脚手架工具Linux/MacGOMOD=on && go get -u github.com/zzpu/kratos/tool/kratosWindowsset GOMOD=on && go get -u github.com/zzpu/kratos/tool/kratos...原创 2020-02-21 16:00:34 · 783 阅读 · 0 评论 -
【gorm】update传入struct对象,零值字段不更新问题
使用gorm的update接口,出现如果字段为零值,则不会生成字段的更新语句// Update update attributes with callbacks, refer: https://jinzhu.github.io/gorm/crud.html#update// WARNING when update with struct, GORM will not update fiel...原创 2020-01-17 14:21:34 · 9763 阅读 · 0 评论 -
Golang GC导致的文件描述符不可用
现象1. 压力测试时,使用syscall.Accept得到 bad file descriptor,server直接无法响应。原因1.syscall.Accept使用的fd来源是在自己代码初试化的时候通过TCPListener.FIle().Fd()直接拿到,且在自己的代码中通过int 类型保存了这个返回的系统fd,后续直接使用int 类型存储的fd值进行epoll相关操作2.事...转载 2019-11-09 11:47:55 · 718 阅读 · 0 评论 -
【golang源码分析】程序初始化(Centos 7)
1 调试和源码分析不同的平台,会执行不同的初始化代码,然后跳到golang的main函数。本次验证过程是基于CentOS 7平台。测试代码如下:package mainfunc main() { println("hello, wenTao!")}执行编码,禁止优化go build -gcflags "-N -l" main.go找入口[root@VM...原创 2019-11-07 23:37:39 · 287 阅读 · 0 评论 -
【golang源码分析】内存管理和gc原理
1 Linux系统内存管理1.1 进程地址空间一个linux进程的虚拟地址空间分布如图所示,分为内核空间和进程空间,对于一个32位操作系统来说,4GB的空间分成两部分,低地址的0~3G给用户空间,高地址的3G~4G给内核空间。图源:http://www.dongcoder.com/detail-1060768.html1.2 系统层面内存分配从操作系统角度看,进程分配内存有...原创 2019-10-29 17:04:46 · 2049 阅读 · 0 评论 -
【golang源码分析】并发模型MPG
1 MPG并发模型1.1 MPG 概念M代表着一个内核线程 一个M就是一个内核线程,goroutine就是跑在M之上的 P代表着(Processor)处理器 它的主要用途就是用来执行goroutine的,所以它也维护了一个可运行的goroutine队列,和自由的goroutine队列,里面存储了所有需要它来执行的goroutine。 G代表着goroutine 实际的数据结构(就...原创 2019-10-26 14:40:02 · 763 阅读 · 1 评论 -
【golang源码分析】编译和调试源码
1 获取源码和编译1.1 获取源码git clone https://github.com/golang/go.git1.2 编译禁止优化export GO_GCFLAGS="-N -l"编译sh all.bash2 调试源码2.1 准备GDB安装gdbbrew install gdb给固定板签名创建证书参考https://segmentfa...原创 2019-10-25 12:54:32 · 577 阅读 · 0 评论 -
【go】mac下brew升级golang
在命令行下直接运行:brew upgrade go原创 2018-11-20 11:55:41 · 23902 阅读 · 0 评论 -
【golang】for range中取地址操作的陷阱
Tips:for range创建了每个元素的副本,而不是直接返回每个元素的引用例子1:package mainimport "fmt"func main() { slice := []int{0, 1, 2, 3} myMap := make(map[int]*int) for index, value := range slice { myMap[index] = ...原创 2019-02-15 18:54:25 · 5545 阅读 · 4 评论 -
【golang】defer总结
1 defer后面必须是函数调用语句,不能是其他语句,否则编译器会出错package mainimport "log"func foo(n int) int { defer n++ //defer log.Println("n=", n) return n}func main() { var i int = 100 foo(i)} ...原创 2019-02-22 16:59:16 · 336 阅读 · 0 评论 -
前缀树Trie及代码实现(golang)
1 什么是Trie树Trie树,即字典树,又称单词查找树或键树,是一种树形结构,是一种哈希树的变种。典型应用是用于统计和排序大量的字符串(但不仅限于字符串),所以经常被搜索引擎系统用于文本词频统计。它的优点是:最大限度地减少无谓的字符串比较,查询效率比哈希表高。小写英文字母或大写英文字母的字典数是一个26叉树。Trie树的根结点是不保存数据的,所有的数据都保存在它的孩子节点中。有字符串go, ...原创 2019-03-06 16:19:56 · 4623 阅读 · 0 评论 -
【golang】浅析rune数据类型
在学习golang基础的时候,发现有个叫rune的的数据类型,当时不理解这个类型的意义。查询,官方的解释如下:// rune is an alias for int32 and is equivalent to int32 in all ways. It is// used, by convention, to distinguish character values from int...转载 2019-03-06 17:29:34 · 1182 阅读 · 0 评论 -
【golang实现的CMS系统QOR】运行qor-example
QOR是首个使用Go语言开发的电商系统、CMS的SDK。官网:https://getqor.comgithub:https://github.com/qor/qor按照github上的说明,下载源码# Get example app$ go get -u github.com/qor/qor-example# Setup database$ mysql -uroot -p...原创 2019-03-04 11:04:04 · 2224 阅读 · 0 评论 -
【golang实现的CMS系统QOR】管理模块菜单
1 管理模块菜单图示2 使用示例默认情况下,菜单资源添加到一级菜单栏Admin.AddResource(&User{})也可以自定义二级菜单,将资源添加到耳机菜单Admin.AddResource(&Product{}, &admin.Config{Menu: []string{"Product Management"}})Admin.AddR...原创 2019-03-14 16:27:04 · 1165 阅读 · 5 评论 -
基于redis实现的延时队列
1 需求背景用户抢单成功之后,如果一定时间后没有完成任务,任务自动取消 用户提交任务审核后,如果商家一定时间后没有审核,任务自动通过类似的场景比较多 简单的处理方式就是使用定时任务 假如数据比较多的时候 有的数据可能延迟比较严重,而且越来越多的定时业务导致任务调度很繁琐不好管理。2 技术支撑Redis 有序集合和集合一样也是string类型元素的集合,且不允许重复的成员。不同的...原创 2019-03-07 16:53:14 · 3439 阅读 · 0 评论 -
【微服务记录】服务发现Consul
1 Consul简介Consul是HashiCorp公司推出的开源工具,用于实现分布式系统的服务发现与配置。与其他分布式服务注册与发现的方案相比,Consul的方案更“一站式”,内置了服务注册与发现框 架、分布一致性协议实现、健康检查、Key/Value存储、多数据中心方案,不再需要依赖其他工具(比如ZooKeeper等)。使用起来也较 为简单。Consul用Golang实现,因此具有天然可移...原创 2019-03-26 15:48:09 · 426 阅读 · 0 评论 -
【微服务记录】Protobuf
1Protobuf简介Protobuf是一种平台无关、语言无关、可扩展且轻便高效的序列化数据结构的协议,可以用于网络通信和数据存储,与msgpack类似,有名的gRPC就是基于Protobuf实现的,Protobuf3是其第三个版本。2Protobuf语法2.1 定义一个消息类型message Article {required int32 article_id=...原创 2019-03-24 16:24:32 · 500 阅读 · 0 评论 -
【微服务记录】用go-micro编写微服务
1 用工具micro快速生成服务模板go-micro提供了一个命令行工具microdotzdeMacBook-Pro-2:foo dotz$ microNAME: micro - A microservice toolkitUSAGE: micro [global options] command [command options] [arguments...] ...原创 2019-03-27 19:43:31 · 1003 阅读 · 0 评论 -
【查找算法go】查找单链表倒数第m个元素
查找单链表倒数第m个元素,只需要两个标记指针间隔m个单位package searchimport "fmt"type ListItem struct{ Value int NextItem *ListItem}func Revertm(items *ListItem,m int) *ListItem{ var dst,head *ListItem head = it...原创 2019-04-03 11:22:35 · 441 阅读 · 0 评论 -
go mod依赖包管理
之前一直使用第三方依赖包管理工具govendor,go1.11之后官方出了go mod,使用非常简单,可以完全抛弃GOPATH和vendor。1GO111MODULE=auto在原来的项目上测试[root@VM_0_14_centos xxx]# go mod init xxxgo: modules disabled inside GOPATH/src by GO111MODUL...原创 2019-05-25 12:25:54 · 10967 阅读 · 0 评论 -
go-sql-driver: invalid connection 和 [mysql] 2019/xx/xx 12:xx:55 packets.go:36: unexpected EOF
在使用go-sql-driver/msqyl驱动过程中,发现偶尔出现invalid connection错误,字面上看就是无效连接的意思。开始以为是数据库压力问题或是网络不好,后来发现服务器和数据库是走内网的,网络出现问题几率非常小;只是在测试服务器上跑,没多少连接,不存在压力问题。最后只能分析代码里面的原因。最后确定问题在:db.SetConnMaxLifetime(3600*time...原创 2019-06-08 16:14:34 · 4454 阅读 · 1 评论 -
使用cpu的时钟周期作为随机数发生器的种子和遇到的坑
Go语言runtime中的每个线程也有自己的一个随机数发生器,当然也是伪的,这个伪随机数发生器的种子设置采用了另外一种方法——使用了cpu的时钟周期计数器。go语言的实现采用了一段汇编代码读取cpu的cycle信息,如下:TEXT runtime·cputicks(SB),7,$0 RDTSC SHLQ $32, DX ADDQ DX, AX RET具体解析请参考:https...原创 2019-08-17 11:42:38 · 938 阅读 · 0 评论 -
go发送邮件
1.获取Go邮件库(自带发送不了)go get gopkg.in/gomail.v12.包含库import ( "gopkg.in/gomail.v1")3.例子//info.From:发件地址或账号//to: 收件地址//body:邮件内容//port:邮件服务器端口//info.Host:邮件服务器地址//info.Password:密码f原创 2016-07-14 21:54:38 · 2159 阅读 · 0 评论 -
【docker】打包go项目出现 x509: failed to load system roots and no roots provided
原始dockerfile如下FROM alpine:latestMAINTAINER xxx "xxx@gmail.com"WORKDIR $GOPATH/src/appADD conf $GOPATH/src/app/confADD xxx $GOPATH/src/app/xxxRUN mkdir /lib64 && ln -s /lib/libc.musl...原创 2018-10-22 17:41:54 · 2003 阅读 · 0 评论 -
golang 打开浏览器
package desktopimport ( "fmt" "os/exec" "runtime")var commands = map[string]string{ "windows": "cmd /c start", "darwin": "open", "linux": "转载 2018-10-11 17:42:41 · 5401 阅读 · 0 评论 -
go中实现并发安全的ConcurrentMap
之前在项目中需要在内存中用map维护诸多设备结构信息(包含设备名,设备状态,控制信道长连接,以及长短数据信道连接,资源信息指针等)。我们知道go实现的map不是多协程安全的(并发访问可能导致):fatal error:concurrent map read and map write 为了避免这个问题,在map结构中添加了读写说来保护临界区,如下://管理所有设备的MAP结构type RWDev...原创 2018-05-19 00:43:37 · 8366 阅读 · 2 评论 -
go性能调优之火焰图
了解到go中有pprof包来做代码的性能监控,可以查看堆栈、cpu信息等。在两个地方有包:net/http/pprofruntime/pprof但是使用起来并不是特别好用(不是特别直观)。之前在接触systemtap的时候,了解到火焰图这个东西。后来了解到uber开源了一个生成火焰图的工具——go-torch。下面整理下,之前使用分析的一个过程。1 添加pprof代码首先我们要在实例的main函数...原创 2018-05-16 19:41:02 · 5536 阅读 · 0 评论 -
IDEA出的Golang专门IDE
之前只能安装插件支持Go,现在IDEA除了专门的IDE了 https://www.jetbrains.com/go/?fromMenu原创 2017-05-22 17:47:38 · 726 阅读 · 0 评论 -
go语言原生http库分析(1)
构建一个HTTP服务器的简单例子package main import ( "net/http") func SayHello(w http.ResponseWriter, req *http.Request) { w.Write([]byte("Hello"))} func main() { http.HandleFunc("/h原创 2016-07-03 23:36:16 · 2075 阅读 · 0 评论 -
intellij idea 支持 go
感觉intellij idea对于go的支持最好 最喜欢的还是函数跳转支持的很好,可以很方便的分析函数调用过程。下面说下让intellj支持go。1.下载intellj 链接2.安装好后,添加go插件。有两个源(选其中一个即可)a. Alpha:https://plugins.jetbrains.com/plugins/alpha/5047b. Nightly:https://pl原创 2016-10-12 12:44:13 · 3862 阅读 · 0 评论 -
go 获得当天0时0分0秒时间戳
t := time.Now() tm1 := time.Date(t.Year(), t.Month(), t.Day(), 0, 0, 0, 0, t.Location()) tm2 := tm1.AddDate(0, 0, 1)原创 2016-07-18 15:28:30 · 20816 阅读 · 0 评论 -
go监听随机端口
func Start_Random() (int, error) { //监听随机端口 l, err := net.Listen("tcp", "0.0.0.0:0") if err != nil { beego.Error("CAN'T LISTEN: ", err) return 0, err } por原创 2016-08-12 15:58:55 · 3344 阅读 · 0 评论 -
go库中自带的反向代理功能和内网代理
先看反向代理库type ReverseProxy struct { // Director must be a function which modifies // the request into a new request to be sent // using Transport. Its response is then copied // back to the original...原创 2016-09-19 20:21:19 · 9862 阅读 · 0 评论 -
Json请求重定向问题
我们对http请求做身份验证,如果验证不通过,会让浏览器重定向到登录页。如:beego中:this.Redirect("/login", 302)但对于Json,直接让页面重定向是不可行的,这是Json请求相当于子页面,只能让子页面重定向,不能让父页面重定向,要实现目的,使用下面方式可行:this.Ctx.WriteString(" language='javasc原创 2016-08-25 21:16:10 · 3915 阅读 · 0 评论 -
字符串转time格式时间
build := "2016-01-01 23:59:59" //时间字符串 loc, _ := time.LoadLocation("Local") //获取时区 et, _ := time.ParseInLocation("2006-01-02 15:04:05", build, loc) //time格式原创 2016-08-24 10:22:50 · 1349 阅读 · 0 评论 -
序言
因为公司项目需求,需要用到GO语言。现在开篇把之前遇到和解决的问题总结一下。原创 2016-07-03 17:31:18 · 337 阅读 · 1 评论 -
golang中方法接收者为指针和非指针的区别
golang中,struct的method的形式如下: func (r ReceiverType) funcName(parameters) (results) package main import "fmt" type testint int //乘2 func (p *testint) testdouble() int { ...原创 2018-05-15 14:46:07 · 6330 阅读 · 0 评论 -
beego orm多字段唯一键约束
1 手动修改数据库表alter table user_friends add constraint user_friends_user_id_friend_user_id unique (user_id,friend_user_id);2 代码中添加(需要设置自动建表,如果已建好则需要删除表,重新建表)// 多字段唯一键func (u *User) TableUnique() [...原创 2018-09-17 19:39:18 · 4495 阅读 · 0 评论