
Go
molaifeng
道阻且长,行则将至;行而不辍,未来可期。
展开
-
golang 复杂数据结构解析
对于构造复杂的数据结构时,需要用到 map,而不是单纯依靠 slice 及基础结构体。原创 2023-02-27 22:59:06 · 574 阅读 · 0 评论 -
解决 golang json 中 invalid character ‘\r‘ in string literal 报错
也就是 json 在解析 \r\n 需要加上转义符。同时,在 golang 中,用反引号也可以解决。跑上面的代码,会报题头的错误。原创 2023-01-01 23:18:18 · 3821 阅读 · 0 评论 -
解决 php post 而 gin 收不到问题
php 这边用 post+json 形式向 golang 的 gin 框架发送数据,之前网页版都是使用正常,最近有个需求是一个功能接入移动端内部办公系统,通过接入 sdk 调用实现网页上的功能。原创 2022-12-04 23:02:16 · 1160 阅读 · 0 评论 -
解决 golang 中输出 (MISSING)
用户反馈,golang 的某个服务列表突然打不开了,在本地复现后,发现,原本返回的 json 串,里面突然多了 (MISSING) 这个东东原创 2022-08-24 09:08:21 · 3008 阅读 · 0 评论 -
golang 中 map 排序
但若要对golang的map按照value进行排序,比如实现网址访问量从高低排序,思路却是不能用map,而要用struct存放key和value,实现sort接口,就可以调用sort。如果针对的是简单的key、value的形式,可以先把key收集到一个slice里,然后给slice排序,再循环输出对应的value即可。golang中没有专门的map排序函数,且map默认是无序的,也就是你写入的顺序和打印的顺序是不一样的。.........原创 2022-07-24 17:30:12 · 4188 阅读 · 0 评论 -
golang 处理变量模板
这种json形式的字符串,后端变把name解析成zhangsan。最近有个需求,后端配置相关模板,提供接口给兄弟部门用,模板里有形如。这个库,比如上面的需求可以用如下代码实现。变量,三方调用的时候会发送。类似这种解析变量的需求,推荐。...原创 2022-07-24 16:43:01 · 315 阅读 · 0 评论 -
golang 之时间国际化
近期一个上马的项目涉及到国际化,其中一个点就是时间显示的问题,比如现在时间是 北京时间 2022-05-29 23:21:30,这个在国内显示没问题,如果在墨西哥显示呢,显然是不能用北京时间的,毕竟两者隔了十三个时区,这时对方才 2022-05-29 10:21:30 呢。北京时间是东八区,墨西哥是西五区。显然,时间国际化涉及到了时区概念,这里对时区做个简单的介绍。国际上规定,每隔 15° 划为一个时区,全球可分为 24 个时区。以本初子午线为基准,从西经 7.5° 到东经 7.5° 就是 GMT原创 2022-05-30 18:27:23 · 1390 阅读 · 0 评论 -
golang 执行命令行
一般情况下,在 golang 中执行一些命令如 git clone,则可以使用 exec.Command 函数func RunCommand(path, name string, arg ...string) (msg string, err error) { cmd := exec.Command(name, arg...) cmd.Dir = path err = cmd.Run() log.Println(cmd.Args) if err != nil { log.Println("e原创 2022-04-03 20:41:21 · 4767 阅读 · 0 评论 -
golang 定时任务处理
在 golang 中若写定时脚本,有两种实现。一、基于原生语法组装func DocSyncTaskCronJob() { ticker := time.NewTicker(time.Minute * 5) // 每分钟执行一次 for range ticker.C { ProcTask() }}func ProcTask() { log.Println("hello world")}二、基于 github 中封装的 cron 库实现package taskimport (原创 2022-03-31 23:55:00 · 6429 阅读 · 0 评论 -
使用 pprof 分析 go-callvis
go-callvis 是一个可视化的项目源码调用链路分析工具。这里有篇简要分析源码的文章 https://mp.weixin.qq.com/s/dUXXGd8hqEhKE_Cj4EY2Lwpprof 是 golang 内置的性能优化前的性能分析工具。今天就介绍下用 pprof 来分析 go-callvis 的性能,看看到底耗时在哪。先把 go-callvis 下载到本地git clone https://github.com/ofabry/go-callvis.gitcd go-callv原创 2022-02-28 23:39:20 · 377 阅读 · 0 评论 -
golang http 包 Response.Body.Close
今天简单说下 Response.Body.Close,当发起一个请求后,需要手动关闭此请求。但,这个关闭的位置也有考究。一开始,项目中的代码是如下顺序写的。res, err := cli.Do(req)defer res.Body.Close()if err != nil { fmt.Println(err.Error()) return}正常情况下,是不会遇到有问题的情况。在不定期检测线上的日志的时候,还是会发现,第二行那报空指针错误invalid memory address or原创 2021-12-31 15:58:53 · 4951 阅读 · 2 评论 -
解决 golang 中 wrote more than the declared Content-Length
写个网关还是很能练手的,这不在对接新的项目时,就遇到题头的报警。_, err = fmt.Fprintf(w, string(str))if err != nil { fmt.Println(err.Error())}一开始,没想到这块会报错,而是直接忽略的,这样就造成了测试时啥也没返回,但是上游是有数据返回的,最后追踪到这里。于是,便开始万能的断点调试了,发现 w 也就是 http.ResponseWriter 有两个属性是对应此错误的,分别是 written 和 contentLength原创 2021-11-24 22:54:19 · 6033 阅读 · 0 评论 -
golang unmarshal map 类型判断
近期遇到以下类似以下接口返回值{ "msg": "this is a test message", "status": "unknown", "data": { "trace":"121212121212" }}上面的 json 串中 status 字段类型不唯一,当为 200 时是成功的,字符串是有问题的,代码解析为var ret map[string]interface{}err := json.Unmarshal([]byte(str), &re原创 2021-11-23 22:26:25 · 1051 阅读 · 2 评论 -
解决 golang 中 invalid character ‘\x1f‘ looking for beginning of value
最近网关又接入了个项目,不过在解析接口返回的 json 串时,却是乱码,查看报错如下invalid character '\x1f' looking for beginning of value程序中的解析代码为content, _ := ioutil.ReadAll(res.Body)err = json.Unmarshal(content, &data)if err != nil { fmt.Println(err.Error())}之前的项目接口解析还是好好的,为啥这个项目原创 2021-11-19 22:46:40 · 5297 阅读 · 1 评论 -
golang中[]byte转成string
项目中 RPC 接口由于在入口直接打印 []byte 字节数组形式了,在查询日志的时候很难辨认,需要把其复制下来,再转成字符串。比如,日志中打印的是 “[104 101 108 108 111 32 119 111 114 108 100]” 这样形式的 byte 数组,那么具体操作如下func byte2Str() { bt := []byte{104,101,108,108,111,32,119,111,114,108,100} fmt.Println(string(bt)) // 输出 he原创 2021-10-31 14:16:58 · 17282 阅读 · 1 评论 -
golang 中利用 map 动态向 json 添加字段
目前在做一个微型网关,一期的功能就是接收请求、匹配路由、鉴权、转发请求,再把响应接住并动态添加字段最后返回给调用方。简单来说就是把请求方的响应接住,并在外层加上网关层特有的字段,如下{ "response": { "data":[], "traceId":"1212121212112" }}其中 response 和 traceId 就是网关动态加的,这个可以利用 golang 里的 map 属性来实现。ret := map[string]interface{}{}data :=原创 2021-08-29 18:30:46 · 2712 阅读 · 2 评论 -
Go 错误处理
错误处理在默认情况下,当发生错误后(panic) ,程序就会退出(崩溃)如果我们希望:当发生错误后,可以捕获到错误,并进行处理,保证程序可以继续执行。还可以在捕获到错误后,给管理员一一个提示(邮件短信…)基本说明Go 语言追求简洁优雅,所以,Go 语言不支持传统的 try…cact…finally 这种处理。Go 中引入的处理方式为: defer, panic, recov...原创 2019-12-31 22:03:24 · 186 阅读 · 0 评论 -
Go 数组、切片和 map
数组数组可以存放多个同一类型数据。数组也是一种数据类型,在 Go 中,数组是值类型。package mainimport "fmt"func main() { var hen [6]float64 hen[0] = 1.00 hen[1] = 1.00 hen[2] = 2.00 hen[3] = 3.00 hen[4] = 4.00 hen[5] = 50.00...原创 2019-11-30 18:25:01 · 1018 阅读 · 0 评论 -
Go 面向对象
引言Go 的面向对象,语法清奇,思路独特,和传统的面向对象语言如 Java 完全不同,可开阔思路。结构体谈到面向对象,就不得不提其载体 structtype 结构体名称 struct{ field1 type field2 type}以上便是其定义的语法,使用也很简单type Student struct { Name,Address string Age in...原创 2019-10-31 23:38:06 · 369 阅读 · 0 评论 -
Go 初探
缘由现在用 Go 的公司越来越多,学 Go 的童鞋也越来越多,于是我便随大流开始学 Go,这篇博客便记录今晚安装及成功运行第一个 Hello World 的例子。安装进入 https://studygolang.com/dl 下载 https://dl.google.com/go/go1.13.windows-amd64.msi ,由于没有连上 Linux 环境,便在 Windows 上安...原创 2019-09-05 23:40:26 · 354 阅读 · 0 评论