Go语言杂文
文章平均质量分 58
fananchong2
这个作者很懒,什么都没留下…
展开
-
protobuf-go pragma.go 文件介绍
自己,其他第 3 方是没办法实现。目录下,对第 3 方不可见。因为第 3 方没有办法实现。接口的第 3 方扩展实现。下面依次说明实现原理。原创 2024-01-26 23:13:25 · 663 阅读 · 0 评论 -
Golang 使用 AST 获取方法和参数名以及应用举例
有了方法、参数名,加上反射,那么就可以方便生成胶水代码,自动集成进 HTTP 、 gRPC 等。可以把这些信息写入 map 声明,这样代码里就有类似反射参数的功能了。还是基于上面的获取的方法、参数名的 map 实例信息,就可以展开了。在做一些自动生成的代码工作时,有时需要知道方法以及对应的参数名。可以通过 AST 事先获取方法的参数名。如果仅是方法,利用反射机制就可以解决。而参数名,程序编译后,已经丢失。原创 2024-01-13 15:15:56 · 912 阅读 · 1 评论 -
go grpc-go 连接变动,导致全服 gRPC 重连 BUG 排查
在构建 resolver.Address 时,字段 Attributes 添加了 NodeNumber 属性;addrConn.tryUpdateAddrs 内用的是 DeepEqual ,这里 Addresses 字段又是起作用的。项目中遇到一个问题,每当有节点变更时,整个 gRPC 网络连接会重建。即,不考虑属性字段内容,即只要 ip port 一样就是同个连接。加了 Address.Equal 统一了 Address。操作的定义(说明官方也发现了这个问题 = =|)因此,项目中的代码还是写错的。原创 2023-12-20 17:59:21 · 471 阅读 · 0 评论 -
MySQL explain(备忘)
MySQL explainSQL 文因为未建索引等,容易产生性能问题MySQL 提供 explain 语句,用来分析 SQL 文执行性能explain type 字段通常根据 explain type 字段,可以了解 SQL 文执行性能性能: null > system/const > eq_ref > ref > ref_or_null >index_merge > range > index > all网上有很多这类文章介绍:http原创 2022-05-07 09:39:15 · 154 阅读 · 0 评论 -
记一次 go 服务内存泄漏
pprof inuse_space 正常一般查看内存是否泄漏,看下 inuse_space 下的函数占用是否符合预期即可定位pprof goroutine 数量正常依次,常见的协程泄漏也是一大内存泄漏常见问题debug.FreeOSMemory() 释放不掉因此初步定位,是否是 golang GC 持有了内存尚未归还系统结果无效使用 pmap 查看 go 进程内存占用情况Address Kbytes RSS Dirty Mode Mapping000000原创 2022-04-16 14:54:34 · 1155 阅读 · 0 评论 -
Cgo 异常捕获,不退出
问题最近有网友问,怎么 Cgo 异常捕获,不退出: https://github.com/fananchong/test_cgo_coredump/issues/2这里做了个例子,记录一二之前本人也写过 《cgo crash 捕获 go 调用栈、 c 调用栈》 ,加上本文,可以实现完美的异常捕获框架异常捕获,处理代码//go:build !plan9 && !windows// +build !plan9,!windowspackage main/*#include &原创 2021-12-25 22:52:02 · 1211 阅读 · 0 评论 -
Go 程序释放不用的内存
Go 程序内存通过 pprof 发现,一个 Go 进程实际 in use 内存只占用几百兆,实际物理内存占用了 4、5G原因很清晰,进程的内存分配器,没有把空闲内存还回系统挤兑内存可以通过挤兑内存的方式,触发进程归还内存#include <stdio.h>#include <string.h>#include <unistd.h>#include <cstdlib>int main() { char *p = NULL; c原创 2021-09-30 15:03:34 · 3260 阅读 · 0 评论 -
fsnotify 与 too many open files
fsnotifyfsnotify 是用来监听文件、目录变化的一个 golang 开源库在 Linux 系统使用中,遇到了too many open files问题首次尝试通常,有 2 处配置太小,会触发too many open files错误:/etc/sysctl.conf文件中的fs.file-max/etc/security/limits.conf文件中的hard nofile与hard nofile因此,更改了相关值:[root@qa5 ~]# ulimit -a | grep原创 2021-09-22 21:55:33 · 2324 阅读 · 0 评论 -
Golang 捕捉竞态信息
竞态信息Golang 因为大量多协程编程,会导致代码中有很多竞态问题Golang 自身提供了 -race 编译选项,来辅助开发者捕获各种竞态问题本文汇总下捕获竞态信息中遇到的各种问题测试用例package mainimport ( "fmt" "time")var counter = 0func f1() { counter++}func f2() { counter++}func main() { fmt.Println("hello world") go原创 2021-05-06 16:56:44 · 240 阅读 · 0 评论 -
go 定时器泄漏,导致 CPU占用高
问题服务器长期开着,遇到一个问题,没有几个负载,CPU 占用了 2 个核go tool pprof 了下,大致如下调用消耗:top100 ,显示 runtime.siftdownTimer 占了大头(2 个图,取至不同服务)问题分析可以看到,均为定时器相关代码调用review 了下代码,确实很多 ticker 未释放参考https://forum.golangbridge.org/t/runtime-siftdowntimer-consuming-60-of-the-cpu/3773原创 2021-03-09 14:28:34 · 2761 阅读 · 0 评论 -
golang 捕获 C/C++ 错误并做善后处理
cgo 里 crashcgo 中的 crash ,在 golang 中是捕获不到信号量的,诸如信号量 SIGSEGV未曾逆向思维,考虑过是否在 cgo 里做信号量捕获,今日试了下,是可以的即,golang 调用 c 代码,可以保证进程不会无故消失,以及做不少善后处理:告警coredump 捕获例子本人实验了下,例子如下https://github.com/fananchong/test_cgo_coredump/blob/master/main2.go分 2 步走:1. C 代码捕原创 2021-02-03 19:23:45 · 1955 阅读 · 2 评论 -
golang 使用 text/template 模板生成代码(备忘)
text/templatetext/template 是官方自带的模板生成库使用例子package mainimport ( "fmt" "os" "sort" "text/template")var tepl1 = `func (m *{{.ModelName}}) HMapKey() string { return fmt.Sprintf("{{.TableName}}:{{.EntityDBID}}:%v", m.{{.EntityID}})}`var tepl2 =原创 2021-01-25 10:39:05 · 2927 阅读 · 0 评论 -
golang math/rand 的协程安全问题
math/randmath/rand 是 golang 官方自带的随机数库今天看 grpc-go 代码时,才发现,原来 math/rand 不能算协程安全的库看官方文档说明(摘自 GOROOT/src/math/rand/rand.go 1 - 19 行):// Copyright 2009 The Go Authors. All rights reserved.// Use of this source code is governed by a BSD-style// license tha原创 2020-09-20 20:21:06 · 2018 阅读 · 1 评论 -
golang 程序 windows 下调用 dll 文件(备忘)
例子https://github.com/fananchong/test_cgo_sharedlib.git要点说明windows 下,cgo 连接通过,需要 .a 文件类似如下命令,做成 .a 文件:call "C:\Program Files (x86)\Microsoft Visual Studio\2019\Community\VC\Auxiliary\Build\vcvars64.bat"echo "start cl ..."cl /c /I ../include ../sourc原创 2020-08-11 15:31:58 · 1142 阅读 · 0 评论 -
golang 编译期设置变量值(备忘)
说明本文演示给程序打上时间戳,并输出目录结构fananchong@localhost:~/test$ tree.├── go.mod├── g.sh├── main.go└── version └── version.gomain.gopackage mainimport ( "fmt" "os" "test/version")func main() { args := os.Args i原创 2020-06-23 17:56:51 · 753 阅读 · 0 评论 -
cgo crash 捕获 go 调用栈、 c 调用栈
鱼与熊掌无法兼得暂时没有找到调用栈中,同时显示 go 、 c 相关函数但是,发现 go 程序因 cgo 抛异常 crash 时,可以分别捕获各自的函数调用栈go 调用栈go 程序 crash 时,会向 stderr 打印所有 go 协程调用栈信息因此只要捕获这些信息到文件即可然后用关键字cgocall定位日志c 调用栈可以用 gdb 直接从 coredump 文件中获取例子本人简单写了一个测试例子:github: https://github.com/fananchong/test_c原创 2020-05-20 00:17:39 · 1817 阅读 · 0 评论 -
VSCode 远程 Linux 的 Golang 开发环境搭建(内网)(备忘)
准备材料在 《VSCode 远程 Linux 的 Golang 开发环境搭建(备忘)》 Windows 机(外网)都通顺后准备以下材料:其他须知go env可以获取 go GOPATH ,比如 /home/fananchong/go ,windows 也一样材料目录位置说明extensionsWindows 机 %USERPROFILE%.vscod...原创 2020-03-12 18:06:40 · 1300 阅读 · 0 评论 -
VSCode 远程 Linux 的 Golang 开发环境搭建(备忘)
准备工作本地安装最新版本的 VSCode (version 1.43.0+)本地/远程 Linux 机,安装 golang (version 1.14.0+)本地/远程 Linux 机设置 golang 代理命令 : go env -w GOPROXY=https://goproxy.cn,directVSCode 安装相关插件安装如下插件Remote-SSHms-vs...原创 2020-03-11 23:51:42 · 7148 阅读 · 6 评论 -
tabtoy :一款打包工具介绍(备忘)
tabtoy最近朋友介绍了一款打包工具,初步看了下,挺好的,备忘之github 地址: https://github.com/davyxu/tabtoy例子官网介绍已经很详细了,这里截下图,不用看文字,更好了解1. excel例子 excel 参见 : https://github.com/davyxu/tabtoy/blob/master/v2/example/Sample.xlsx...原创 2020-03-06 12:07:34 · 2243 阅读 · 0 评论 -
goclipse的autoimport(备忘)
默认安装好的goclipse插件后,是不会自动补全import语句。有第3方插件:GoImports可以实现补全import语句。安装步骤如下:Execute go get golang.org/x/tools/cmd/goimportsGo to Preferences -> GoSet gofmt to ${GOPATH}/bin/goimports (which is where goi原创 2017-11-08 21:59:12 · 435 阅读 · 2 评论 -
behavior3editor生成过程(备忘)
1. 下载nodejs, node-v9.1.0-linux-x64.tar.xz,解压,进入目录:cp -r bin/* /usr/local/bin/cp -r include/* /usr/local/include/cp -r lib/* /usr/local/lib/cp -r share/* /usr/local/share/(window 直接下载安装程序安装)2.npm i原创 2017-11-14 12:09:03 · 2787 阅读 · 2 评论 -
关于 VSCode 、 Go Modules 、 Vendor 、 GOPATH
VSCode 的 Golang 配置,点击这里VSCode 与 GOPATH可以参考官方文档: https://github.com/Microsoft/vscode-go/wiki/GOPATH-in-the-VS-Code-Go-extension里面介绍了很多种配置 GOPATH 的方法最简单的为:.vscode/settings.json 文件中,增加:{ &quot;go.in...原创 2018-12-12 22:22:31 · 14856 阅读 · 0 评论 -
golang 依赖包国内代理
go getgopm : https://github.com/gpmgo/gopm安装 gopmgo get -u github.com/gpmgo/gopm下载包,使用 gopm get 代替 go getgopm get -u -v [包地址]安装包gopm bin -u -v [包地址]go modulegoproxy : https://gopro...原创 2019-05-12 12:47:12 · 8705 阅读 · 0 评论 -
Golang 项目使用 Gitlab CI/CD 自动化持续集成 (备忘)
Gitlab CI/CD 自动化持续集成该功能主要是代码提交到 gitlab 后,gitlab 能按照指定的脚本,去运行诸如测试、构建、发布自动化,避免手工操作本文将演示以下集成项目:测试(Test),包含:覆盖测试(code_coverage)检查代码风格/错误(lint_code)竞态检查(race_detector),只能检查单元测试中的竞态检查单元测试(unit_te...原创 2019-07-26 11:26:56 · 7371 阅读 · 0 评论 -
github 开新坑
背景这几年,一直尝试使用 golang ,写出一个易用可靠的服务器框架在 github 上开了以下几个坑:深坑制作思路主要问题go-x使用 k8s 做服务发现服务节点能知道其他服务节点加入或离开需要部署 k8s 才能用,限制太大需要自己处理服务节点间的互连、通信没有区分框架层与应用层go-xserver内置连接管理器,做服务发现应用层使用插件加载内置处理服务...原创 2019-07-23 12:12:35 · 619 阅读 · 0 评论 -
使用 protobuf 自定义选项生成自定义代码
前言在《protoc-gen-go 介绍与源代码分析 》中介绍了基于 protoc-gen-go 制作自定义 protoc go 插件想要更好的编写自定义插件,必然会遇到如何在 proto 定义文件中,做些自定义内容本文介绍,如何通过 protobuf 自定义选项生成自定义代码protobuf 自定义选项protobuf 自定义选项可以用在 proto 文件全局域、消息、字段、服务、方法...原创 2019-08-27 15:26:31 · 7772 阅读 · 0 评论 -
Eclipse + Golang 开发环境搭建 (要点备忘)
安装步骤官网下载Golang,安装官网下载eclipse,安装安装eclipse golang插件 - GoClipse 2种方式,在线安装或离线安装。详细参见:https://github.com/GoClipse/goclipse/blob/latest/documentation/Installation.md#installation调试需要安装gdb 比较方便的方法是,官网下载原创 2017-06-08 18:33:12 · 3428 阅读 · 0 评论