Go sync.Map笔记
分类目录归档:Golang
Go 迭代变量的陷阱
在并发的goroutine中遇到这个问题,还以为是goroutine的问题,或者Go闭包的问题, 一层一层分析下来,才知道是Go本身迭代变量的问题,想起了PHP的foreach陷阱【PHP引用理解之神奇的foreach面试题】,不仅感慨深入掌握一门语言何其不易呀
先说结论:Go在循环体中,每次遍历的变量是同一个,指向同样的内存地址,这是语言本身的一个陷阱
问题先行,我们先来看看问题
继续阅读
gojsonp学习使用笔记
Goland高效使用笔记
Goland是JetBrains公司的付费Go语言IDE,改公司的编辑器还有IntelliJ IDEA(Java语言),PyCharm(python), WebStorm(js/css)等。没有特别说明以下内容都是在Mac环境下
一、常用快捷键
继续阅读
Gopher China2021 参会笔记
一、背景
6月26、27日,第七届 Gopher China 技术分享大会在北京市朗丽兹西山花园酒店举行。有机会去体验了一次今年国内的Gopher盛会,过去一个多星期了,还是想留下点痕迹,以示纪念
继续阅读
一致哈希Go实现及应用(一致哈希学习笔记三)
一致哈希算法介绍参考本站文章《一致哈希算法理解(一致哈希学习笔记一)》
回顾一致哈希算法步骤:
0、将每一个服务器节点按照ip或者server_name, 通过hash函数(eg: crc32)得到对应的一组hash整数值,这里称做hash_servers,并对得到的整数值按由小到大进行排序。
1、将key也通过上面同一个hash函数计算得到对应hash整数值, 这里称为hash_key。
2、遍历hash_servers,用hash_key与hash_servers中的数逐个比较,当hash_key最后小于hash_servers中的那个数存在时,这个数对应的节点就是这个key所存储的节点,否则存在第一个节点。
一、Go实现
这里主要是一致哈希算法Go的一种实现笔记,PHP的实现参考本站文章《一致哈希PHP实现及应用(一致哈希学习笔记二)》
继续阅读
Go大切片并发查找问题笔记
一、问题描述
超长切片,切片元素类型为int,切片中元素乱序,使用多个goroutine查找给定值是否存在,找到目标值后立即结束所有的goroutine的执行
二、解决思路
把slice分成多段,每一段起一个task goroutine进行查找,找到目标值后在全局channel中放一条消息。在main goroutine中用select阻塞读取channel中的消息,读到后调用context包的cancel方法,在所有task goroutine的context Done通道中放一条消息, task goroutine读到消息后退出。
继续阅读
Go viper包处理JSON笔记
第一部分 前景提要
一、背景
用Go搭一个小项目, 按传统的套路把开发环境和生产环境配置信息写在配置文件config.json中, 初始化加载配置,解析出数据。看着是解析一个JSON的小事,过程中却发生了3次演进:
1、定义一个配置文件对应的结构体。
2、递归加载配置的全部节点。
3、使用viper
继续阅读
Go playground访问HTTP 451笔记
一、背景
访问4年前在Go playground上分享的代码片段,都提示Unavailable For Legal Reasons,请求状态码为451。由于内容比较重要,花了一些时间研究原因,最终除了一个特例,其他都找回来。
二、关于HTTP 451
HTTP 451 Unavailable For Legal Reasons, 即因法律原因不可用。当用户请求访问某个经政府审核等查核方法后认定不合法的来源时,就会显示这个错误代码。
继续阅读
Go包管理工具学习笔记
一、了解Go包管理的动机
我们知道etcd使用Go实现的,前段时间准备看下etcd源码,结果用go get下载安装etcd源码问题层出不穷,表面的原因是etcd依赖的Go模块有循环依赖,深层次原因还是Go包管理处在混乱及快速演进的过程中。
所以,想阅读调试etcd源码,必须跨过对Go包管理不熟悉这道坎。
不得不先说一句,Go包管理工具真是混乱至极,尤其是用了下Node.js的包管理工具npm(最近项目用到了Node.js, 简单用了用),没有对比就伤害。
继续阅读