
Go
chrispink_yang
To learn, to cope.
展开
-
Go使用unixSocket实现进程间传递文件描述符
描述因为项目需要接触了相关实现, 以此补足了这方面的知识.实现代码receiver先启动, 监听指定unix sock, 读取传递的文件并打开, 打印文件内容.sender负责进程内打开文件,并发送到指定unix sock中.文件内容为简单一行文本: hello chris.receiver实现package mainimport ( "fmt" "net" "os" "syscall")const ( // socksPath unixsock文件所在地址 sock原创 2020-09-07 19:52:00 · 1960 阅读 · 0 评论 -
[源码分析]go-graceful如何shutdown gracefully
概述服务的优雅关闭是指在关闭服务进程时, 不影响还在处理中的逻辑.总体上的要点只有两个:服务处于关闭中状态, 不再接收新的请求.等待还在处理中的请求, 可设置超时机制.经典应用场景进程接收到突发的中断信号平滑升级源码解析//graceful.gofunc (srv *Server) Serve(listener net.Listener) error { if srv.ListenLimit != 0 { listener = LimitListener(listener原创 2020-08-14 17:58:30 · 1443 阅读 · 0 评论 -
golang的闭包内引用值和range实现
问题描述一个简单的遍历功能func demo0(){ // 顺序遍历, i,a 地址不变, 值变化 arr := []string{"dog", "cat", "mouse"} for i, a := range arr{ fmt.Printf("func %d get %s\n", i, a) }}输出:func 0 get dogfunc 1 get catfunc 2 get mouse然后想要通过goroutine来完成并发func demo2(){ arr :=原创 2020-08-04 20:12:24 · 645 阅读 · 0 评论 -
【问题解决】Go1.14出现json: invalid number literal, trying to unmarshal "\"\"" into Number
问题描述在go 1.14中使用json.Number类型, 在json.Unmarshal时会返回错误json: invalid number literal, trying to unmarshal “\”\"" into Number解决方法暂时不要用go 1.14使用interface{}类型替代json.Number错误示例package mainimport ( /...原创 2020-04-30 15:34:42 · 2685 阅读 · 0 评论 -
golang并发http请求几种方式
概述go中方便的协程写法, 让并发变得很简单, 让开发者很多时候不需要关心协程(线程)管理的问题, 不过也是有值得注意的地方.下面以一个http请求的例子, 请求的服务是进制数据-手机号码归属地查询.(找了很久才找到方便学demo的免费API, 想跑demo的朋友注册一下即可)并发方式平时常用到两种方式做并发请求.简单一点, 一次请求开一个线程, 线程中完成请求与响应处理.严格一点,...原创 2020-04-05 17:20:57 · 20833 阅读 · 0 评论 -
golang在defer中处理异常error的方式
问题描述golang中异常需要自己判断并处理, 代码中常常会有很多如val, err := GetVal(key)if err != nil{ //handle err}之类的代码,但是当同一个函数内的代码中有多处处理异常, 并且处理方式统一时 , 可以用defer处理.这时常常犯一个错误.错误代码:package mainimport ( "fmt")func ...原创 2020-04-02 01:19:46 · 6032 阅读 · 1 评论 -
全局唯一键的一种生成方案(golang)
概述主要是两部分内容:设计一种不易冲突的唯一键生成方案.一次唯一键冲突的解决实录1. 设计一种不易冲突的唯一键生成方案.一句话说明使用纳秒数做36进制转换后得到的数字与字母组合成的值作为唯一键.足以应付中等并发量的服务(QPS约等于120).var num2char = "0123456789abcdefghijklmnopqrstuvwxyz"//10进制转16或36进制...原创 2020-03-23 01:05:47 · 1273 阅读 · 0 评论 -
问题解决方法: gin-contrib/cors给group路径下添加cors时,OPTIONS请求得到404响应
问题描述使用gin-contrib/cors想给gin的路由router添加CORS支持时, 如果只把cors中间件添加在某个group中, 会对浏览器发来的OPTIONS跨域请求返回404, 使跨域请求无法进行.问题代码package mainimport ( "github.com/gin-contrib/cors" "github.com/gin-gonic/gin" "ne...原创 2020-03-09 00:31:21 · 3693 阅读 · 0 评论 -
select配合time.After实现超时控制
package mainimport( "fmt" "time")func main(){ ch := make(chan string) go HeavyOperation(ch) // 函数耗时3s, 输出timeout // go LightOperation(ch) // 函数耗时1s, 输出light operation done select { ...原创 2020-01-02 15:22:39 · 697 阅读 · 0 评论 -
Error: use of .(type) outside type switch..(type)只能在switch中使用
.(type)判断类型只能在switch当中使用package mainimport( "fmt")func main(){ into := 0 checkType(into)}func checkType(into interface{}){ switch into.(type){ case int: fmt.Println("int") // int case...原创 2019-12-30 20:29:18 · 1155 阅读 · 5 评论 -
Golang判断元素是否存在数组中
个人常用函数func IsContain(items []string, item string) bool { for _, eachItem := range items { if eachItem == item { return true } } return false}使用方法:var word := "my"var sentence := "my wo...原创 2019-12-16 21:46:20 · 42182 阅读 · 1 评论 -
Golang中encoding/json关于omitempty的坑
一句话概括omitempty标签并不是省略空值, 而是省略变量类型对应的零值. 如果刚好赋值为零值, 会被json.Marshal方法省略掉. (我认为是bug)发现问题type TestStruct struct { BoolVar bool `json:"bool_var,omitempty"` IntVar int `json:"...原创 2019-12-16 21:25:51 · 6043 阅读 · 2 评论 -
go语言string、int、int64互相转换
#string到intint,err:=strconv.Atoi(string)#string到int64int64, err := strconv.ParseInt(string, 10, 64)#int到stringstring:=strconv.Itoa(int)#int64到stringstring:=strconv.FormatInt(int64,10)...转载 2019-12-09 10:46:33 · 481 阅读 · 0 评论 -
Go函数接收可变参数
package mainimport( "fmt" "reflect")func receiveSlice(manyints ...int) { //该函数可接收多个int参数, 打包为[]int类型slice fmt.Println(reflect.TypeOf(manyints), len(manyints), cap(manyints)) fmt.Printf("%#v \...原创 2019-12-03 21:24:16 · 702 阅读 · 0 评论 -
Golang拼接字符串的5种方法及其效率
package mainimport( "fmt" "time" "bytes" "strings")var loop = 100000func main(){ var s string s1 := "hello" s2 := "world" var start time.Time //加号+连接 start = time.Now() for i := 0; i&...原创 2019-12-03 10:42:24 · 4355 阅读 · 4 评论 -
Golang错误解析"runtime error: invalid memory address or nil pointer dereference"
概述从刚上手golang时就经常遇到这个错误, 三个月之后对golang有些了解, 开始理清一下原因.问题原因var p *Obj某个指针变量声明之后, 还没有经过赋值时默认指向nil, 直接调用指针就会报错runtime error: invalid memory address or nil pointer dereference示例package mainimport(...原创 2019-10-22 10:58:47 · 33122 阅读 · 0 评论 -
从Python到Golang学习笔记
从本科学过C/C++和java,但是实际项目中用的多的是python. 因此python深刻影响了我的编程思维, 从python转到Go, 让我总结了一些学习笔记.静态/动态如果你在python之前没有C或JAVA等静态语言的代码量积累, 接触go之后, 编程习惯上最大的各种不同基本都可以归根于动态语言与静态语言的区别.简单来说,两门语言各自的编译解释的方式不同,造成了编程时思维的不同.py...原创 2019-05-23 04:01:06 · 1058 阅读 · 0 评论 -
Golang实现常用六大排序算法
使用Golang实现了以下排序算法:冒泡排序选择排序插入排序快速排序归并排序堆排序主函数package mainimport ( "fmt" "math/rand" "sort" "time")const ( num = 10000 // 测试数组的长度 rangeNum = 100000 // 数组元素大小范围)func main() {...原创 2019-05-30 19:50:25 · 3405 阅读 · 0 评论 -
Golang实现生产者消费者模型
代码package mainimport ( "fmt")func main() { c := make(chan int) go Producer(c) Consumer(c)}func Producer(c chan int) { for i := 0; i < 10; i++ { fmt.Println("Produce:", i) c <- ...原创 2019-05-30 20:46:02 · 1305 阅读 · 0 评论 -
Golang-goroutine实现筛法求素数(附性能测试)
算法原理参考自今日头条Go建千亿级微服务的实践 举出的goroutine例子代码//参数n, 找到(0,n)以内的素数func get_prime(n int) { origin, wait := make(chan int), make(chan struct{}) go FilterPrime(origin, wait) for i := 2; i <= n; i++ {...原创 2019-06-18 02:17:30 · 896 阅读 · 0 评论 -
【问题解决】go-gin使用c.JSON()返回JSON为空
问题描述今天使用c.JSON(), 返回前fmt.Println()可以正常输出, 但是c.JSON()一直返回为空.代码示例type Msg struct{ name string `json:"user"` message string number int}r.GET("/moreJSON", func(c *gin.Context) { // 直接...原创 2019-07-25 09:41:21 · 8149 阅读 · 0 评论 -
【问题解决】使用redis-go出现“invalid expire time in set“错误
问题描述err = client.Set(UserId, Bstr, 300).Err()提示invalid expire time in set问题解决与原因引入time moduleimport time改为err = client.Set(UserId, Bstr, 300*time.Second).Err()即可正常设置Set方法的定义如下:func (c ...原创 2019-07-25 13:12:22 · 4828 阅读 · 0 评论 -
sublime+golang build配置go运行环境
安装sublime text 3http://www.sublimetext.com/3安装 Sublime Text 3 的 Package Control这是用来安装各种插件的入口. 我也不理解为什么不整合在一起.参考https://packagecontrol.io/installation#st3ctrl + ` 在下方输入import urllib.request,os,ha...原创 2019-07-22 11:45:27 · 3171 阅读 · 0 评论 -
关于Golang中defer执行顺序与运用的简明示例
不废话了,从例子中更好总结eg1: 执行与return位置自底向上大多数教材说defer方法是先进后出的栈结构, 但我认为从return位置向上找defer更直观package mainimport( "fmt")func main(){ example()}func example() { defer func(){ fmt.Println("1") }() ...原创 2019-08-09 11:36:46 · 354 阅读 · 0 评论 -
关于Go的零值
Go 语言之旅零值没有明确初始值的变量声明会被赋予它们的 零值。零值是:数值类型为 0,布尔类型为 false,字符串为 “”(空字符串)。实践在json反序列化时, 缺少的键值就会按零值处理.package mainimport "fmt"func main() { var i int var f float64 var b bool var s string...原创 2019-08-19 11:23:43 · 646 阅读 · 0 评论 -
【问题解决】go run无法拉取gitlab上的模块问题
问题描述go run .\main.gogo: finding gitlab.xxx.cn/xxx/xxx v1.3.9go: gitlab.xxx.cn/xxx/xxx@v1.3.9: unknown revision v1.3.9内部gitlab上 发现go mod无法拉取模块 一开始提示是unknown revision, 但是发现也不是版本问题执行基本的git clone发现也...原创 2019-08-15 16:48:22 · 2540 阅读 · 0 评论 -
Golang实现睡眠排序(SleepSort)
睡眠排序睡眠排序原理就是为一个长度为n的待排序数组创建一个长度为n的线程向量,将待排序数字作为线程sleep函数的参数,sleep完成后输出数字,那么数字越大sleep时间越长,就排到越后面.联想到Golang特点之一就是使用goroutine处理多线程情景, 因此做了尝试.多个goroutine休眠时间以数字大小成正比, 休眠结束后放入管道channel, 管道内数字排序即为数组升序排...原创 2019-05-26 01:44:04 · 2015 阅读 · 0 评论