Go
文章平均质量分 58
月守护
卡拉卡拉
展开
-
使用go pprof进行golang程序内存分析
use pprof to fix oom原创 2022-11-18 11:58:47 · 2561 阅读 · 1 评论 -
乐观锁,悲观锁与Golang
悲观锁悲观锁(Pessimistic Lock), 顾名思义,就是很悲观,每次去拿数据的时候都认为别人会修改,所以每次在拿数据的时候都会上锁,这样别人想拿这个数据就会block直到它拿到锁。传统的关系型数据库里边就用到了很多这种锁机制,比如行锁,表锁等,读锁,写锁等,都是在做操作之前先上锁。乐观锁乐观锁(Optimistic Lock), 顾名思义,就是很乐观,每次去拿数据的时候都认为别人不会修改,所以不会上锁,但是在更新的时候会判断一下在此期间别人有没有去更新这个数据,可以使用版本号等机制。乐观锁适原创 2021-05-07 16:49:38 · 1750 阅读 · 0 评论 -
一道关于 goroutine 的面试题
问题package mainimport ( "fmt" "time")func main() { ch1 := make(chan int) go fmt.Println(<-ch1) ch1 <- 5 time.Sleep(1 * time.Second)}问:上面代码输出什么?是5还是别的呢?分析如果代码换成如下:package mainimport ( "fmt" "time")func main() { ch1 := make(c原创 2021-01-21 18:10:15 · 393 阅读 · 0 评论 -
context.Context
在golang控制并发(sync.WaitGroup和context.Context)中,我们有讲到context的作用及简单使用,现在扩展开来讲讲context还有哪些别的东西Context 接口Context 的接口定义的比较简洁,我们看下这个接口的方法。type Context interface { Deadline() (deadline time.Time, ok bool) Done() <-chan struct{} Err() error Value(key in原创 2020-11-16 22:49:47 · 1187 阅读 · 0 评论 -
golang多协程异步读写demo
package mainimport ( "fmt" "sync")func main() { kk := make(chan int, 1000) var setwg sync.WaitGroup var readwg sync.WaitGroup for i := 1; i < 3; i++ { setwg.Add(1) go Set(kk, &setwg) } for i := 1; i < 3; i++ { readwg.Add(1) g原创 2020-11-06 11:06:55 · 1311 阅读 · 0 评论 -
如何安全地退出goroutine
摘自"go语言高级编程"原创 2020-05-19 11:10:47 · 256 阅读 · 0 评论 -
golang函数传参详解
golang的基本类型分类***golang中的基本类型分为值类型和引用类型***参考Go中的值类型和引用类型函数传参的两种方式1.值传递2.引用传递注:golang函数传参都是以复制变量的方式,不支持引用的方式特殊的是:go语言闭包函数对外部变量是以引用的方式使用 参考由"go语言闭包函数对外部变量是以引用的方式使用"引发的闭包探讨golang传递基本类型的不同golang传递值类型是指复制了一份值之后传递,改变形参并不能改变原有实参的值package mainimport原创 2020-05-14 17:15:43 · 3050 阅读 · 1 评论 -
由"go语言闭包函数对外部变量是以引用的方式使用"引发的闭包探讨
在go语言中,函数参数都是以复制的方式(不支持以引用的方式)传递。但特殊的是:go语言闭包函数对外部变量是以引用的方式引用问题:为什么go语言闭包函数对外部变量是以引用的方式引用一般函数传参以复制的方式可参考:golang的函数传参说明是闭包首先要知道说明什么是闭包闭包可以理解为"定义在一个函数内部的函数"只有函数内部的子函数才能读取局部变量,在本质上,闭包就是将函数内部和函数外部连接起来的一座桥梁闭包的用途闭包的用途可以读取函数内部的变量让这些变量的值始终保持在内存中扩展原创 2020-05-14 15:17:58 · 902 阅读 · 0 评论 -
break作用域问题
break作用域:在select代码块中作用于select;没有select在for代码块时作用于fordemo:package mainimport ( "fmt" "time")var ch = make(chan int, 100)func main() { ch <- 98 ch <- 99 testBreakScope() fmt.Println("main 函数执行结束") time.Sleep(3 * t原创 2020-05-11 13:47:25 · 538 阅读 · 0 评论 -
golang查询数据库没有数据时返回值问题
使用golang的datadase/sql包进行mysql数据库查询,没有查询到结果时,返回值是多少sqlStr := "select distinct domain from securitymanager.domainthreat where ip =?" rows, err := db.Query(sqlStr, "222.73.219.63")没有查询到数据时返回值:返回的er...原创 2020-04-24 14:02:07 · 2185 阅读 · 0 评论 -
golang函数传参中可变参数和切片相互转化
可能遇到的一个问题(以golang操作mysql为例):sqlStr := "insert into securitymanager.tests(id,name) values (?,?)" //要执行的sql语句gg := []interface{}{1, "sd"} //要插入的数据的slice//应该准备执行db.Exec(query string,args ...int...原创 2020-04-03 13:45:55 · 3514 阅读 · 0 评论 -
使用goland由go1.10转到go1.13过程记录
go1.10使用状况之前公司用的都是svn进行版本控制,go的版本也是比较老的1.10版本。所有的源代码都在gopath下,引用第三方库的时候也是下载源代码之后放到gopath下,当做本地代码直接使用,不好的地方在于第三方库没有版本管理的概念,兼容性很差go1.13使用状况后来公司把版本管理迁移到gitlab上,同时应用上go 1.11之后的go mod进行第三方库版本管理首先是下载最新...原创 2020-03-16 16:37:54 · 500 阅读 · 0 评论 -
Golang结构体中的tag
// json数据解析和绑定type Login struct { User string `form:"username" json:"user" uri:"user" xml:"user" binding:"required"` Password string `form:"password" json:"password" uri:"password" xml:"password" b...原创 2020-01-07 10:35:39 · 2634 阅读 · 0 评论 -
golang的gc回收针对堆还是栈?变量内存分配在堆还是栈?
这里不讲垃圾回收的机制先给出三个结论:golang的垃圾回收是针对堆的引用类型的全局变量内存分配在堆上,值类型的全局变量分配在栈上局部变量内存分配可能在栈上也可能在堆上我们都知道变量占有内存,内存在底层分配上有堆和栈。值类型变量的内存通常是在栈中分配引用类型变量的内存通常在堆中分配注意这里说的是"通常",因为变量又分为局部变量和全局变量。当变量是全局变量时,符合上面所说...原创 2019-12-19 17:33:42 · 4166 阅读 · 0 评论 -
Go的sync.map删除元素,内存会自动释放吗?
sync.map是什么?请参照博客:Go1.9 sync.Map揭秘go的原生map删除元素,内存会自动释放吗?请参照博客:Go的原生map中删除元素,内存会自动释放吗?先说结论:如果删除的元素是值类型,如int,float,bool,string以及数组和struct,map的内存不会自动释放如果删除的元素是引用类型,如指针,slice,map,chan等,map的内存会自动...原创 2019-12-19 16:02:16 · 3933 阅读 · 0 评论 -
Go的原生map中删除元素,内存会自动释放吗?
对于频繁增删map的场景,我们很关心map的内存是否会自动释放。先说结论:如果删除的元素是值类型,如int,float,bool,string以及数组和struct,map的内存不会自动释放如果删除的元素是引用类型,如指针,slice,map,chan等,map的内存会自动释放,但释放的内存是子元素应用类型的内存占用将map设置为nil后,内存被回收实验以子元素是整形和...原创 2019-12-19 13:27:56 · 6221 阅读 · 0 评论 -
golang解析yml文件
要解析yml文件,首先需要知道yml文件语法格式,可以参考博客:https://blog.csdn.net/csdniter/article/details/103313432解析yml文件和解析json数据方法一样,使用的是github上第三方开源gopkg.in/yaml.v2第一步:新建一个yaml文件,比如conf.yamlhost: localhost:3306user: ro...原创 2019-11-29 17:15:21 · 2519 阅读 · 0 评论 -
golang文件操作
创建目录(os包)创建单个目录func Mkdirfunc Mkdir(name string, perm FileMode) errorMkdir使用指定的权限和名称创建一个目录。如果出错,会返回*PathError底层类型的错误err:=os.Mkdir("./dir1",0755)if err!=nil{ fmt.Println(err)}创建多级目录func M...原创 2019-11-13 18:17:50 · 211 阅读 · 0 评论 -
Go1.9 sync.Map揭秘
为什么要有sync.Map,顾名思义,sync.Map也是一种map,相当于对原生map做了封装,之所以出现的原因是map不是线程并发安全的。go设计map是考虑到map同时读写的场景不多,所以设计map在进行写操作时是不允许进行其他的操作,否则会报fatal error: concurrent map read and map write错误,示例如下:package mainfunc m...原创 2019-11-01 17:29:06 · 356 阅读 · 0 评论 -
Go如何操作mysql
怎么连接上mysqlGo语言中的database/sql包提供了保证SQL或类SQL数据库的泛用接口,但并不提供具体的数据库驱动。使用database/sql包时必须注入(至少)一个数据库驱动。通常用"github.com/go-sql-driver/mysql"下载依赖:go get -u github.com/go-sql-driver/mysqlimport ( "database...原创 2019-10-23 19:48:45 · 291 阅读 · 1 评论 -
序列化和反序列化
go中自带模块encoding/json,但是本身性能不足,滴滴开源的json库json-iterator,性能提升了好几倍,常用于项目中高并发数据json解析处理Marshalpackage mainimport ( "encoding/json" "fmt" "os" "github.com/json-iterator/go")func mai...原创 2019-10-18 15:47:27 · 280 阅读 · 0 评论 -
Go的并发
简介Go语言在语言层面天生支持并发,这也是Go语言流行的一个很重要的原因。不像其他语言,是通过开线程,通过操作系统调度来说实现并发Go语言的并发通过goroutine实现。goroutine类似于线程,属于用户态的线程,我们可以根据需要创建成千上万个goroutine并发工作。goroutine是由Go语言的运行时(runtime)调度完成。Go程序会智能地将 goroutine 中的任务合...原创 2019-10-11 16:46:53 · 254 阅读 · 0 评论 -
Go中net/http的使用
Go语言内置的net/http包十分的优秀,提供了HTTP客户端和服务端的实现。这里主要讲***服务端***的实现默认的ServerListenAndServe使用指定的监听地址和处理器启动一个HTTP服务端。处理器参数通常是nil,这表示采用包变量DefaultServeMux作为处理器。Handle和HandleFunc函数可以向DefaultServeMux添加处理器。http.H...原创 2019-09-19 14:06:13 · 535 阅读 · 0 评论 -
Go中的值类型和引用类型
值类型1.变量直接存储值,内存通常在栈中分配2.包含基本数据类型:int,float,bool,string以及数组和struct引用类型1.变量存储的是一个地址,这个地址存储最终的值。内存通常在堆上分配。通过GC回收。2.有指针,slice,map,chan等函数参数传递方式1.值传递*2.引用传递注意:无论是值传递还是引用传递,传递给函数的都是变量的副本。不过,值传递是值得拷...原创 2019-09-16 09:29:12 · 279 阅读 · 0 评论