![](https://img-blog.csdnimg.cn/20201014180756927.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
go-插件
a...Z
golang php rust
展开
-
update传入struct对象,零值字段不更新问题
-原创 2023-11-30 10:40:10 · 425 阅读 · 0 评论 -
Golang GC导致的文件描述符不可用
https://blog.csdn.net/idwtwt/article/details/102985319原创 2023-11-30 10:39:05 · 391 阅读 · 0 评论 -
go-resty
这里我们看一个三方库go-resty,一个优秀的 HTTP 客户端库,支持链式调用,超时控制,TLS,Cookie 管理,链接池,代理,支持多种认证方式包括基本认证和 OAuth 2.0,支持发送 JSON、XML 和 URL 编码的数据,文件上传和下载,支持发送大量请求并批量处理响应结果,同时提供简单易用的 API 接口。注意在使用某些认证方式时,需要提供相应的附加参数。需要额外依赖库:使用 go-resty 需要引入第三方库,而 net/http 则是 Go 标准库自带的,不需要额外引用。原创 2023-08-01 20:19:51 · 1464 阅读 · 0 评论 -
viper读取etcd热更新
项目启动肯定少不了配置文件,一般我们会放在单独的目录,例如config中,有yaml、ini、json等等格式,一般用开源的读取相应问的文件映射到结构体中。但是当一个项目秒杀频繁控制库存和限流策略等、或者其他需要频繁的变更配置文件的时候,就需要频繁的更改代码,打包,上线。时间成本高,实效性也低。所以一般都做配置热更新。做配置热更新的有很多consul、Firestore、etcd、也有redis等等KV存储,今天我们要讲的是viper和etcd的热更新操作。原创 2023-06-26 17:10:58 · 1006 阅读 · 0 评论 -
如何在go重打印函数调用者信息Caller
如何在Go的函数中得到调用者函数名?有时候在Go的函数调用的过程中,我们需要知道函数被谁调用,比如打印日志信息等。例如下面的函数,我们希望在日志中打印出调用者的名字。func Foo() { fmt.Println("谁在调用我?") bar()}func Bar() { fmt.Println("谁又在调用我?")}首先打印函数本身的名称最简单的方式就是硬编码。 因为在编译之前,我们肯定知道打印的时候所在哪个函数,但是更好的方式原创 2022-08-08 11:23:46 · 667 阅读 · 0 评论 -
viper读取etcd做配置热更新
概述 项目启动肯定少不了配置文件,一般我们会放在单独的目录,例如config中,有yaml、ini、json等等格式,一般用开源的读取相应问的文件映射到结构体中。但是当一个项目秒杀频繁控制库存和限流策略等、或者其他需要频繁的变更配置文件的时候,就需要频繁的更改代码,打包,上线。时间成本高,实效性也低。所以一般都做配置热更新。做配置热更新的有很多consul、Firestore、etcd、也有redis等等KV存储,今天我们要讲的是viper和etcd的热更新操作准备工作 我用的是mac m1安装原创 2022-10-19 17:28:56 · 889 阅读 · 0 评论 -
Go 语言私有依赖的拉取
go ssh 替换http拉取依赖原创 2022-12-19 15:27:01 · 1042 阅读 · 0 评论 -
开源数据库管理工具
开源数据库管理工具原创 2022-07-25 14:51:57 · 636 阅读 · 0 评论 -
go-内存逃逸
go run -gcflags '-m -m -l' main.g原创 2022-07-25 14:49:51 · 97 阅读 · 0 评论 -
go控制线程退出
go控制线程退出原创 2022-07-15 15:57:01 · 560 阅读 · 0 评论 -
go交叉编译
交叉编译交叉编译是用来在一个平台上生成另一个平台的可执行程序。比如我工作开发时用的Mac,系统内核是darwin,小张用的是外星人,系统内核是windows 。那么假如我编写的代码依赖了系统底层平台或处理器架构特性的Go包时,比如说我上周在文章《Go服务迁到K8s后老抽风重启? 记一次完整的线上问题解决过程》里写的,为了把Go运行时的panic错误重定向到日志文件,我用了syscall.Dup2这个函数把标准错误原来的文件描述符替换成了自己指定的日志文件的描述符。syscall.Dup2是Go语言在类U原创 2022-01-05 20:40:01 · 1141 阅读 · 0 评论 -
golang-如何用全局参数打印程序运行信息
更多好文关注 v。golang技术实验室1、GOGCGOGC 用于控制GC的处发频率, 其值默认为100,意为直到自上次垃圾回收后heap size已经增长了100%时GC才触发运行。即是GOGC=100意味着live heap size 每增长一倍,GC触发运行一次。如设定GOGC=200, 则live heap size 自上次垃圾回收后,增长2倍时,GC触发运行, 总之,其值越大则GC触发运行频率越低, 反之则越高,如果GOGC=off 则关闭GC./** * @Author: zHan原创 2021-12-30 20:43:19 · 763 阅读 · 0 评论 -
golang-mongoDB引包问题
import ( "go.mongodb.org/mongo-driver/mongo" "go.mongodb.org/mongo-driver/mongo/options" "go.mongodb.org/mongo-driver/bson/primitive")原创 2021-01-11 15:16:26 · 581 阅读 · 0 评论 -
[]*aa 和 *[]aa区别
[]*aa 和 *[]aa区别[]*aa 是切片类型–基础类型*[]aa 是引用类型举例当使用 gorm的时候 *[]aa 需要进行初始化(new)的操作[]*aa不需要,因为[]*aa是切片类型(基本类型),会append,重新分配地址原创 2020-12-24 16:39:17 · 416 阅读 · 2 评论 -
go启动的参数奥妙
更多好文请vgolang技术实验室1、GOGCGOGC 用于控制GC的处发频率, 其值默认为100,意为直到自上次垃圾回收后heap size已经增长了100%时GC才触发运行。即是GOGC=100意味着live heap size 每增长一倍,GC触发运行一次。如设定GOGC=200, 则live heap size 自上次垃圾回收后,增长2倍时,GC触发运行, 总之,其值越大则GC触发运行频率越低, 反之则越高,如果GOGC=off 则关闭GC./** * @Author: zHangS原创 2021-04-19 19:14:33 · 1905 阅读 · 0 评论 -
time时间格式化
const ( ANSIC = "Mon Jan _2 15:04:05 2006" UnixDate = "Mon Jan _2 15:04:05 MST 2006" RubyDate = "Mon Jan 02 15:04:05 -0700 2006" RFC822 = "02 Jan 06 15:04 MST" RFC822Z = "02 Jan 06 15:04 -0700" // RFC822 with numeric zone RFC850原创 2020-11-11 17:02:17 · 604 阅读 · 0 评论 -
context deadline exceeded
context deadline exceeded第一种 context.WithTimeout客户端服务端问题总结客户端用的上下文是context.WithTimeout 超时时间小于服务端的返回时间,造成 context deadline exceeded第二种 context.WithDeadline客服端服务端响应时间超过1秒结论服务端响应时间超过客户端的等待时间Grpc的链接选项配置...原创 2020-07-13 15:53:58 · 78597 阅读 · 3 评论 -
golang 获取指定时间的月份
times := “2020-09-18 15:04:05”s, _ := time.Parse(“2006-01-02 15:04:05”, times)fmt.Println(s.Year())fmt.Println(int(s.Month()))fmt.Println(s.Day())fmt.Println(s.Date())os.Exit(12)数字形式的直接int()就可以原创 2020-09-18 18:43:22 · 4430 阅读 · 0 评论 -
Gorm 自动update操作自动过滤0和 “ “
Gorm 自动update操作自动过滤0和“gorm会自动过滤结构体的0 和" "type CrmUserTableColumns struct { Id int64 `gorm:"column:ids"` Name string `gorm:"column:xxx"` Account string `gorm:"column:xxx"` Password原创 2020-09-21 15:05:02 · 1441 阅读 · 0 评论 -
main等待其他携程小技巧
mian程等待其他写成退出的小技巧package mainimport ("fmt" "sync")var ( count int rwLock sync.RWMutex)func main() { for i := 0; i < 2; i++ { go func() { for i := 1000000; i > 0; i-- { rwLock.Lock() count ++ rwLock.Unlock() } fmt.Pr原创 2020-09-17 21:56:19 · 134 阅读 · 0 评论 -
grpc transport newbufwriter 占用内存过高
本来一个很简单的服务,发现transport newbufwriter 占用过高,grpc 是基于http2来实现的,是复用一个连接的,怎么会频繁的createTransport呢查看代码发现 if resp, err = workerCl.CarryTask(context.TODO(), &info);nil != err{ return }没有进行连接关闭,导致grpc 会在超时之后不断的重试修改如下ctx,cancel := context.WithTimeout(co原创 2021-05-13 19:29:54 · 786 阅读 · 0 评论 -
golang-获取panic详细信息
记录详细的panic信息及行号package mainimport ( "bytes" "fmt" "log" "runtime" //"runtime/debug")func main() { defer CatchException(func(e interface{}) { log.Println(e) }) zero := 0 x := 3 / zero fmt.Println("x=", x)}/*** 捕获异常try...catch* 用法示例:原创 2020-11-10 23:18:17 · 1474 阅读 · 0 评论 -
golang map嵌套结构体,改变结构体的值
type aa struct { a string b int64 c string d int64}func main() { as := map[int64]*aa{ 11: &aa{ a: "A", b: 1, c: "", d: 0, }, } for index, v := range as { //type sf map[int64]aa //var aaa sf = map[int64]aa{ // index: aa原创 2020-09-11 10:15:41 · 2220 阅读 · 3 评论 -
Go get命令出现terminal prompts disabled解决
Go get命令出现terminal prompts disabled解决ubuntu@ubuntu:~$ go get -u github.com/XXX/OOOO/cd .; git clone https://github.com/XXX/OOOO/ /home/ubuntu/.go/src/github.com/XXX/OOOO/Cloning into '/home/ubuntu/.go/src/github.com/maoxs2/Proj_Ridal'...fatal: could原创 2020-12-17 10:41:29 · 1790 阅读 · 0 评论 -
[]interface{}怎么遍历转化值
var list []interface{} if reflect.TypeOf(delayRunResult).Kind() == reflect.Slice { s := reflect.ValueOf(delayRunResult) for i := 0; i < s.Len(); i++ { ele := s.Index(i) list = append(list, ele.Interface()) } }func (cd *commandDef.原创 2020-07-20 14:35:12 · 1810 阅读 · 0 评论 -
mysq超时 invalid connection 无效链接总结
交互式连接 就是mysql 客户端 和服务器的连接时常非交互式。 可以理解为就是 代码程序连接空闲连接 最大时常wait_timeout默认 8小时查看show variables like "wait_timeout%";交互式最大连接时常interactive_timeout针对交互式连接,wait_timeout针对非交互式连接。所谓的交互式连接,即在mysql_real_connect()函数中使用了CLIENT_INTERACTIVE选项。说得直白一点,通过mysql客户端连接原创 2020-09-03 10:01:34 · 2806 阅读 · 0 评论 -
go中是值传递还是引用传递
1、值传递值传递表面意思就是传递的是值,函数调用传递的总是这个值的副本,接收的地址和原来值的地址是不一样的我们来看个例子package mainimport "fmt"func main(){ //值传递 var a int64 = 10 fmt.Printf("地址是:%p\n",&a) value(a)}func value(a int64){ fmt.Printf("地址是:%p\n",&a)}地址是:0xc00001a090地址是:0xc000原创 2021-03-18 18:18:03 · 741 阅读 · 0 评论 -
go mod查看依赖关系
在使用 Go module 过程中,随着引入的依赖增多,也许你会发现go.mod文件中部分依赖包后面会出现一个// indirect的标识。这个标识总是出现在require指令中,其中// 与代码的行注释一样表示注释的开始,indirect表示间接的依赖。在执行命令go mod tidy时,Go module 会自动整理go.mod 文件,如果有必要会在部分依赖包的后面增加// indirect注释。一般而言,被添加注释的包肯定是间接依赖的包,而没有添加// indirect注释的包则是直接依赖的包,即明原创 2021-08-04 09:39:26 · 5719 阅读 · 1 评论 -
golang-Pprof分析
文章目录分析准备工具go tool pprof参数分析1、当前占用内存inuse_space终端查看web查看2、当前分配对象数量 inuse_objects终端查看web查看3、程序启动到现在的内存使用 alloc_space终端查看web 查看4、从启动到现在的总分配对象 alloc_objects1、PProf2、支持什么使用模式3、可以做什么4、 测试demo5、 访问web6、指标解析1、runtime.futex2、 runtime.gopark--协程指标gopark函数做的主要事情分为两点:原创 2020-12-23 17:14:58 · 3095 阅读 · 3 评论 -
golang-runtime包
1、runtime.GOARCH 平台架构package mainimport ( "fmt" "runtime")func main() { fmt.Println(runtime.GOARCH)}-> % go run test2.goamd642、目标系统package mainimport ( "fmt" "runtime")func main() { fmt.Println(runtime.GOOS)}-> % go run原创 2020-12-29 15:50:35 · 873 阅读 · 0 评论 -
golang的内存回收策略
RSS( Resident Set Size )常驻内存集合大小,表示相应进程在RAM中占用了多少内存,并不包含在SWAP中占用的虚拟内存。即使是在内存中的使用了共享库的内存大小也一并计算在内,包含了完整的在stack和heap中的内存。VSZ (Virtual Memory Size),表明是虚拟内存大小,表明了该进程可以访问的所有内存,包括被交换的内存和共享库内存。MADV_DONTNEED:内核会在进程的页表中将这些页标记为 “未分配”,从而进程的 RSS 就会尽快释放和变小。OS 后续可以将对应原创 2021-02-19 21:53:22 · 3753 阅读 · 0 评论 -
golang-debug包
debug# 1、查看程序GC过程GODEBUG=gctrace=1 go run ./main.go1、强制垃圾回收func FreeOsMemory()FreeOSMemory强制进行一次垃圾收集,以释放尽量多的内存回操作系统。(即使没有调用,运行时环境也会在后台任务里逐渐将内存释放给系统)demopackage mainimport ( "fmt" "runtime" "runtime/debug" "time")func main() { var dic =原创 2020-12-24 15:50:00 · 1431 阅读 · 0 评论 -
unsafe.Pointer和内存对齐
都听说过unsafe和unsafe.Pointer可以相互转换,其实他们也可以跟指针类型转换*T:普通类型指针类型,用于传递对象地址,不能进行指针运算。unsafe.poniter:通用指针类型,用于转换不同类型的指针,不能进行指针运算,不能读取内存存储的值(需转换到某一类型的普通指针)uintptr:用于指针运算,GC不把uintptr当指针,uintptr无法持有对象。uintptr类型的目标会被回收。三者关系就是:unsafe.Pointer是桥梁,可以让任意类型的指针实现相互转换,也可转载 2021-03-18 15:53:03 · 217 阅读 · 0 评论 -
golang升级
$ go versiongo version go1.13.4 darwin/amd64$ rm -rf /usr/local/go到官网下载对应系统版本安装即可原创 2021-07-26 16:42:49 · 177 阅读 · 0 评论 -
golang 字符串截取的比较
普通的截取var benchmarkStr = "此次进行的是中文的截取的性能测试情况"func StrSplit(i,j int,str string)string{ return str[i:j]}func BenchmarkStrSplit(b *testing.B) { for i := 0; i < b.N; i++ { StrSplit(3,10, benchmarkStr) }}结果goos: darwingoarch: amd64pkg: test/原创 2021-02-23 14:38:46 · 557 阅读 · 0 评论 -
wiresshark调试grpc
grpc客户端调试工具Wireshark调试grpc原创 2021-08-05 14:13:14 · 154 阅读 · 0 评论 -
golang-trace分析问题
代码package mainimport ( "context" "fmt" "os" "runtime" "runtime/trace" "sync")func main() { // 为了看协程抢占,这里设置了一个cpu 跑 runtime.GOMAXPROCS(1) f, _ := os.Create("trace.dat") defer f.Close() _ = trace.Start(f) defer trace.Stop() ctx, task :=原创 2020-12-24 17:41:31 · 806 阅读 · 2 评论 -
golang 基准测试和性能测试
1、测试类型在*_test.go文件中有三种类型的函数,单元测试函数、基准测试函数和示例函数。类型格式作用测试函数函数名前缀为Test测试程序的一些逻辑行为是否正确基准函数函数名前缀为Benchmark测试函数的性能示例函数函数名前缀为Example为文档提供示例文档2、测试函数一、测试函数的格式每个测试函数必须导入testing包,测试函数的基本格式如下:func TestName(t *testing.T){ // ...}测.原创 2021-02-23 15:48:23 · 901 阅读 · 0 评论 -
golang-interface
转自公众号 脑子进煎鱼了1、数据结构interface 在运行时才会知道类型runtime.eface 结构体:表示不包含任何方法的空接口,也称为 empty interface。runtime.iface 结构体:表示包含方法的接口。2、tuntime.efacetype eface struct{ _type *_type data unsafe.Pointer}其表示不包含任何方法的空接口。在结构上来讲 eface 非常简单,就两个属性,分别是 _type 和 dat原创 2021-01-21 20:49:59 · 267 阅读 · 0 评论 -
go-获取指针方法所在文件
fmt.Println(runtime.FuncForPC(reflect.ValueOf(cmd.CmdHandler).Pointer()).Name())原创 2021-12-01 20:59:07 · 228 阅读 · 0 评论