![](https://img-blog.csdnimg.cn/20201014180756919.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
Go
ckx0709
坚持,麻木的坚持。
展开
-
go 生成Set/Get方法
为结构体属性生成Set/Get方法原创 2022-06-14 14:29:10 · 2269 阅读 · 1 评论 -
记一次内存飙升排查
最近排查一个因文件上传导致内存飙升,被杀死进程的问题,因为这个动作是在大文件上传的时候触发的,而且必先,所以当时第一反应是因文件流忘记关闭导致内存泄露等问题引起,于是把文件上传功能开头到位排查了一遍,没有发现异常,并且导致进程被杀死只发生在测试环境,本地和开发均正常,本地16G内存,开发8G内存,测试2G。使用pprof排查内存分配使用情况:go tool pprof -alloc_space http://localhost:9003/debug/pprof/heap?seconds=20原创 2021-07-08 10:48:46 · 519 阅读 · 0 评论 -
running gcc failed: exec: “gcc“: executable file not found in %PATH%
缺少CGO编译环境,安装遇到问题较多,记录如下:mingw32/bin/ld.exe: unrecognized option '--high-entropy-va' -----按道理mingw64兼容32,但是实践不行,需要替换64位。原创 2021-03-24 18:17:54 · 1277 阅读 · 0 评论 -
go i++
The increment statement i++ adds 1 to i ; it’s equivalent to i += 1 which is in turn equivalent to i = i + 1 . There’s a corresponding decrement statement i– that subtracts 1.These are statements, not expressions as the y are in most languages in the C f原创 2021-03-20 15:49:14 · 545 阅读 · 0 评论 -
Go Patterns(二)原型模式
原型(Prototype)模式的定义如下:用一个已经创建的实例作为原型,通过复制该原型对象来创建一个和原型相同或相似的新对象。一直也有这样的疑惑,Go是否有必要去实现原型模式?因为我找了很多实现方式,clone的效率并不比new的效率高,Go不是Java,Java的原型模式是通过二进制流的方式实现的clone,Go不同,我做过性能测试,只有一下这种方式和new差不多,性能的提升被没有。但思来想去还是觉得有一个好处吧,以目前的理解能力来看,暂作记录:可以使用深克隆方式保存对象的状态,使用原型模原创 2021-01-13 16:06:32 · 112 阅读 · 0 评论 -
Go 并发注意(一)count++
couunt++不是原则操作:package mainimport ( "fmt" "sync")func main() { count := 0 wg := sync.WaitGroup{} wg.Add(10) for i := 0; i < 10; i++ { go func() { defer wg.Done() for j := 0; j < 100000; j++ { count++ } }() } wg.Wait()原创 2021-01-12 14:56:18 · 452 阅读 · 0 评论 -
Go 枚举
枚举是列出某些有穷序列集的所有成员的程序。优点:1、减轻数据的数据存储的压力,数据库不需要保存启动中、进行中、已完成这些占空间且不优雅的状态,可以今仅存储对应的状态码0,1,2即可。2、前后端、多系统对接的时候也会更加的规范,节约流量,能让我们更清晰动作。3、让我们变量有更好的识别度,如果状态码变量只存储了0,1,2,以后的日子将是灾难,定义枚举,我们可以通过枚举变量更好的理解他是做什么的?他要表达的意思是什么?example:当我们需要对一群学生调研他们修喜欢的课程时,数据库不应该原创 2021-01-08 23:22:52 · 837 阅读 · 0 评论 -
Go Patterns(一) 单例模式
单例(Singleton)模式的定义:指一个类只有一个实例,且该类能自行创建这个实例的一种模式。单例模式有 3 个特点:单例类只有一个实例对象; 该单例对象必须由单例类自行创建; 单例类对外提供一个访问该单例的全局访问点。单例模式的优点和缺点单例模式的优点:单例模式可以保证内存里只有一个实例,减少了内存的开销。 可以避免对资源的多重占用。 单例模式设置全局访问点,可以优化和共享资源的访问。单例模式的缺点:单例模式一般没有接口,扩展困难。如果要扩展,则除了修改原来的代码,没有原创 2021-01-07 19:54:51 · 189 阅读 · 0 评论 -
Go struct 深拷贝与浅拷贝
深浅拷贝的概念:1、深拷贝(Deep Copy):拷贝的是数据本身,创造一个样的新对象,新创建的对象与原对象不共享内存,新创建的对象在内存中开辟一个新的内存地址,新对象值修改时不会影响原对象值。既然内存地址不同,释放内存地址时,可分别释放。值类型的数据,默认全部都是深复制,Array、Int、String、Float,Bool。2、浅拷贝(Shallow Copy):拷贝的是数据地址,只复制指向的对象的指针,此时新对象和老对象指向的内存地址是一样的,新对象值修改时老对象也会变化。释放内存原创 2021-01-06 11:58:09 · 1591 阅读 · 0 评论 -
possible resource leak,difer is called in a for loop
我需要一个手动的分页查询,于是我在for循环语句中使用了defer,程序没报什么错,有时候强迫症还是有他的好处的.defer的用法一直是轻车熟路,但很多框架用的久了,这些原本该熟记的东西却不知不觉中模糊了,尽管这样做程序不会报错,但总是会留下bug的可能:possible resource leak,difer is called in a for loop我看了下ide...原创 2020-01-06 11:38:15 · 1102 阅读 · 0 评论 -
java.io.IOException: unexpected end of stream on Connection.....cipherSuite=none protocol=http/1.1}
使用protobuf做数据传输时,报了这个错,在路由的入口打debug日志也没有打印。后来发现,在定义路由中的使用的probufter结构体使用错误,导致了这个原因。...原创 2019-12-06 19:47:46 · 1255 阅读 · 0 评论 -
go 定时任务-凌晨触发
func ResetSomething() { for { now := time.Now() // 计算下一个零点 next := now.Add(time.Hour * 24) next = time.Date(next.Year(), next.Month(), next.Day(), 0, 0, 0, 0, next.Location()) t := time.Ne...原创 2019-10-21 20:08:10 · 479 阅读 · 0 评论 -
gen 生成gorm映射go文件
gen --connstr "user:password@tcp(127.0.0.1:3306)/databaseName?&parseTime=True" --database tableName --json --gorm --from --guregu原创 2019-07-19 13:41:12 · 858 阅读 · 0 评论 -
redigo连接池——redigo: connection pool exhausted
网上大家好多连接池没有wait这个参数,在连接池链接数达到上限时会报错,影响程序的正常执行,这是不应该的,正常的应该添加这个参数并设置值为true,这样即使链接被用完,会阻塞等待其他协程用完归还之后继续执行://初始化一个poolfunc NewRedisPool(server, password string) *redis.Pool { return &redis.Pool{...原创 2019-06-08 19:13:03 · 3754 阅读 · 0 评论 -
go redis 奖池递减
今天看一个老师傅讲redis,关于redis高并发的情况下实现发奖的设计,中间讲到把奖池的减放在判断的前面可以避免奖品的超发,顿时觉得说的有道理,但是自己敲下来,又不是那么回事,可能我没理解他将的方法。自己写了一下:package mainimport ( "../config" "../pool" "flag" "fmt" "github.com/garyburd/redig...原创 2019-06-08 17:10:35 · 144 阅读 · 0 评论 -
协程交替工作
今天闲的没事,就把以前写的一个爬虫,在看看有没有什么可以改进的地方。看到有一个地方可以改进下,在爬取home页面数据后,获取页面数据,在分别开协程去请求。home页的请求很快大概有2W页每页有数据40条,再把40条数据分别请求,获取具体数据。但是home的请求很快,所需要的chan容量大,于是就想再写一个chan,没读完一页,再去请求下一页。思路如下:package main/*交...原创 2019-06-06 16:59:59 · 93 阅读 · 0 评论 -
go 简单的定时循环执行
当然有成熟的工具corn可以使用,但是总有一些东西值得我们自己去理解一下。以每隔一分钟执行一次为例:package mainimport ( "fmt" "time")var SysTimeLocation, _ = time.LoadLocation("Asia/Chongqing")func init() { //程序初始化的时候就初始化调用一次 do()}...原创 2019-05-08 22:01:51 · 3381 阅读 · 0 评论 -
go 并发满足方案
package mainimport ( "fmt" "sync" "sync/atomic")var num = 0var max = 10000var wg sync.WaitGroup/*1、互斥锁满足并发需求:锁的速度非常快,理论上是高速缓存,*内存总线读写但也应控制锁的范围,不能因为锁的内部过多消耗时间,*而让其他协程挂起等待,从而降低了并发的效率*/va...原创 2019-04-30 18:25:30 · 211 阅读 · 0 评论 -
chan 未初始化死锁而未报错导致接口请求一直等待
用管道创建了一个任务队列,在请求接口的时候网页一直转圈圈,检查网页没有报错,看后台打印,也没有报错,这个就有意思了。虽然很快就找到了问题,但是对于后台不报错,觉得目前做的这一块业务不复杂尚且能够快速应对,倘若在将来的某一个复杂业务里面,会不会想起来有这么一个坑?定义一个管道,而不初始化它,是会报死锁的:初始化它就好了:记录一下吧,就像摸一个快捷键,突然想不起来如何使用也很...原创 2019-04-29 18:50:28 · 258 阅读 · 0 评论 -
go map 声明、初始化、遍历、删除
package mainimport "fmt"//声明mmp的map类型全局变量var mmp map[string]interface{}func main() { //1:mmp只是定义未经初始化,不可以存放数据,err:assignment to entry in nil map【分配到nil映射中的条目】 dmoe1() //2:初始化mmp,并存入数据 dome2...原创 2019-02-28 13:14:29 · 169 阅读 · 0 评论 -
go string 声明、赋值、比较【==、Compare()、EqualFold()】
package mainimport ( "fmt" "strings")//声明字符串变量var str0, str1 stringfunc main() { //1、赋值(未赋值前str默认空字符串) dom1() //2、字符串比较 dome2()}func dome2() { //2、1:==比较,区分大小写 str1 = "A为中华之崛起而撸码"...原创 2019-02-28 15:43:24 · 1572 阅读 · 0 评论 -
go json序列化json.Marshal()
package mainimport ( "encoding/json" "fmt")type student struct { Name string Age int Score float32 Hobby []string}var ( zhangsan, lisi student stuSpl []student mmp ...原创 2019-02-28 16:22:09 · 842 阅读 · 0 评论 -
go json 反序列化Unmarshal
package mainimport ( "encoding/json" "fmt")//定义接收结构体type student struct { Name string Age int Score float32 Hobby []string}const ( str1 = "{\"Name\":\"张三\",\"Age\":12,\"Score\&q原创 2019-02-28 18:45:03 · 297 阅读 · 0 评论 -
go 创建文件整理数据输出json
package mainimport ( "encoding/json" "fmt" "os")type beauty struct { Name string Age int Weight float32 Bwh []int}var zzm beautyfunc init() { zzm = beauty{"佐々木あき", 40, 48.8,...原创 2019-02-28 22:42:51 · 234 阅读 · 0 评论 -
go 读取json文件转换go数据
package mainimport ( "encoding/json" "fmt" "os")type beautyI struct { Name string Age int Weight float32 Bwh []int}var zzmx beautyIfunc main() { //打开文件 file, err := os.Open...原创 2019-03-01 10:16:40 · 833 阅读 · 0 评论 -
go ioutil 快速的插入和读取(主要应用场景:创建新文件保存数据)
相对与bufio的读写不需要手动的去打开和挂起关闭io流,ioutil本身已经做了封装。但是写入的模式相对固定,os.O_WRONLY|os.O_CREATE|os.O_TRUNC,无文件则创建,有文件则删除覆盖原文件内容,重新写入。package mainimport ( "fmt" "io/ioutil")const ( fileAdresI string = "E:...原创 2019-03-02 14:47:04 · 201 阅读 · 0 评论 -
go 封装获取最小n位随机数
//获取一个n位随机数func getRand(n int) int { //设置随机数动态种子 rand.Seed(time.Now().UnixNano()) //求出随机数的位数上限 pow10 := math.Pow10(n) //获取随机数 rand := rand.Intn(int(pow10)) //检查随机数是否小于最小n位随机数 if rand < i...原创 2019-03-06 12:51:49 · 190 阅读 · 0 评论 -
go 实现文件拷贝的三种方法
package mainimport ( "bufio" "fmt" "io" "io/ioutil" "os")var ( sourceFile = "E:/workspace/Goland/文件操作/mzd.jpg" desFile = "E:/workspace/Goland/文件操作/mzx.jpg")func main()原创 2019-03-03 17:19:57 · 315 阅读 · 0 评论 -
【记录一个伟大的坑】for 循环写进chan局部变量指针
敲代码三年了,刚从Java开始,我就一直秉持着当使用循环时我尽量把临时的局部变量定义再循环体外,因为这样可以节约内存的开销,毕竟没声明一个变量,系统都要给他分配地址,都要消耗内存,请看下面代码: for i := 0; i < 100; i++ { var tmp = strconv.Itoa(i) fmt.Println(&tmp,":",tmp) } fmt....原创 2019-03-21 15:25:22 · 441 阅读 · 0 评论 -
wsarecv: An existing connection was forcibly closed by the remote host.
read tcp 127.0.0.1:8848->127.0.0.1:58625: wsarecv: An existing connection was forcibly closed by the remote host.【远程主机强制关闭了现有连接。】tcp协议,一主机对多客户端时,服务器经常会报这个异常而关闭,我也曾翻译了他的意思,但只是明白了文字,为什么?我不知道。直到我看到了客...原创 2019-03-13 10:12:35 · 58843 阅读 · 10 评论 -
connectex: Only one usage of each socket address (protocol/network address/port) is normally permitt
处理一个大文本数据,读取到内存,用多线程并发执行,存入数据库。经多次调试,在程序运行一段时间后间歇性报错——connectex: Only one usage of each socket address (protocol/network address/port) is normally permitt并发量也从10000逐步减少到80,chan的容量也从10000000减少到300,...原创 2019-03-22 14:30:04 · 4591 阅读 · 0 评论 -
go defer的作用域
总是觉得不去敲出来验证,心里始终有疑问,看到一段代码,主协程里for循环里面defer挂起关闭,是在for结束前关闭还是主协程关闭前执行关闭?还是对defer理解的不深刻,查查看标准库文档,有没有,于是自己动手丰衣足食:func main() { file, _ := os.OpenFile("d:/t1.txt", os.O_WRONLY|os.O_APPEND|os.O_CREA...原创 2019-03-19 12:21:09 · 682 阅读 · 0 评论 -
parse 127.0.0.1:8080/import: first path segment in URL cannot contain colon
resp, err = http.PostForm("//127.0.0.1:8080/import", mmp)在127前加双“//”原创 2019-04-26 11:00:47 · 4667 阅读 · 0 评论 -
cannot find package "golang.org/x/time/rate" in any of:
解决方案:git clone https://github.com/golang/time.git原创 2019-04-20 14:34:48 · 1597 阅读 · 0 评论 -
GOPATH 打包封装自己的常用工具包
在goland中封装自己的高复用代码工具包,基本目录结构如下,其中myUtilsProject为高复用代码工具包,src用于存放源代码(包名可根据个人喜好更换名称,但该src目录结构不可变):1、在src下新建utils包(用于存放各种工具包),这里一一个时间工具包为例,在utils下新建一个timeTools.go的go File,需要注意两点:1、工具下的工具文件的包名就不需要更改了,...原创 2019-01-17 23:48:47 · 428 阅读 · 0 评论