• 主页
  • Go
  • ChatOps
  • 归档
  • 关于
所有文章

  • 主页
  • Go
  • ChatOps
  • 归档
  • 关于

【Go】四舍五入在go语言中为何如此困难

2021-01-02

四舍五入是一个非常常见的功能,在流行语言标准库中往往存在 Round 的功能,它最少支持常用的 Round half up 算法。

而在 Go 语言中这似乎成为了难题,在 stackoverflow 上搜索 [go] Round 会存在大量相关提问,Go 1.10 开始才出现 math.Round 的身影,本以为 Round 的疑问就此结束,但是一看函数注释 Round returns the nearest integer, rounding half away from zero ,这是并不常用的 Round half away from zero 实现呀,说白了就是我们理解的 Round 阉割版,精度为 0 的 Round half up 实现,Round half away from zero 的存在是为了提供一种高效的通过二进制方法得结果,可以作为 Round 精度为 0 时的高效实现分支。

带着对 Round 的‘敬畏’,我在 stackoverflow 翻阅大量关于 Round 问题,开启寻求最佳的答案,本文整理我认为有用的实现,简单分析它们的优缺点,对于不想逐步了解,想直接看结果的小伙伴,可以直接看文末的最佳实现,或者跳转 exmath.Round 直接看源码和使用吧!

more >>
  • round
  • half up
  • exmath
  • math
  • go

展开全文 >>

【Go】我与sync.Once的爱恨纠缠

2021-01-01

官方描述 Once is an object that will perform exactly one action, 即 Once 是一个对象,它提供了保证某个动作只被执行一次功能,最典型的场景就是单例模式,Once 可用于任何符合 “exactly once” 语义的场景。

sync.Once 的用法

在多数情况下,sync.Once 被用于控制变量的初始化,这个变量的读写通常遵循单例模式,满足这三个条件:

  • 当且仅当第一次读某个变量时,进行初始化(写操作)
  • 变量被初始化过程中,所有读都被阻塞(读操作;当变量初始化完成后,读操作继续进行)
  • 变量仅初始化一次,初始化完成后驻留在内存里
more >>
  • unsafe
  • sync
  • once
  • OncePointer
  • BufferPool
  • strings.Replacer
  • closeOnce
  • go

展开全文 >>

【Go】高效截取字符串的一些思考

2019-10-31

最近我在 Go Forum 中发现了 [SOLVED] String size of 20 character 的问题,“hollowaykeanho” 给出了相关的答案,而我从中发现了截取字符串的方案并非最理想的方法,因此做了一系列实验并获得高效截取字符串的方法,这篇文章将逐步讲解我实践的过程。

字节切片截取

这正是 “hollowaykeanho” 给出的第一个方案,我想也是很多人想到的第一个方案,利用 go 的内置切片语法截取字符串:

1
2
s := "abcdef"
fmt.Println(s[1:4])

我们很快就了解到这是按字节截取,在处理 ASCII 单字节字符串截取,没有什么比这更完美的方案了,中文往往占多个字节,在 utf8 编码中是3个字节,如下程序我们将获得乱码数据:

1
2
s := "Go 语言"
fmt.Println(s[1:4])
more >>
  • substring
  • substr
  • utf8
  • 中文字符串截取
  • go

展开全文 >>

【ChatOps系列】GitLab系列环境准备

2019-07-27

在搭建 GitLab 系列 ChatOps 时需要掌握一些基础的技能知识,整个 ChatOps 涉及到很多方面,我们至少需要掌握以下技能:

  • Linux 示例中我们主要以 CentOS 7 为主,但是容器内的系统会多种多样
  • Docker 所有的环境都整合在 Docker 容器中,这能简化搭建的过程以及提升交流的效率
  • Docker Compose 所有的容器我们均使用 Docker Compose 进行构建,很方便分享
  • Python 这个很重要,不能忽视它,整个自动部署均是 Pyhon 实现
  • Fabric 这个是 Python 基于 SSH 的应用部署和系统管理的库,我们基于这库实现从部署机到服务器
  • JavaScript/CoffeeScript 机器人 hubot 需要这些语言知识来扩展,当然还有一些其它地方会用到这些。
  • VMware/VirtualBox 需要搭建本地虚拟机模拟环境,示例使用 VirtualBox 演示
more >>
  • chatops
  • devops
  • gitlab
  • linux
  • centos
  • VirtualBox
  • chatops

展开全文 >>

【ChatOps系列】ChatOps简介

2019-07-21

要说 ChatOps 就不得不说 DevOps,DevOps 是来源于 Development 和 Operations 的一个组合词,顾名思义,是一系列过程、方法与系统的统称,旨在促进开发、测试和运维人员之间的沟通与协作。简单来说,是通过引入一系列的「工具」,通过三种不同角色的开发成员间的「协作」而实现的一种「自动化」的工作模式。这种工作方式带来的好处显而易见:

  • 实现持续快速交付
  • 能够降低人力成本

但很大程度上,DevOps 更多是指开发群体之间的一种协作模式(通常也在开发人员中实施),随着全行业的发展和人力成本的攀升,在团队所有角色间贯通的升级版「DevOps」逐渐登场,也就是我们将要重点介绍的 ChatOps。

devops

more >>
  • chatops
  • devops
  • hubot
  • github
  • gitlab
  • slack
  • rocket.chat
  • chatops

展开全文 >>

【Go】类似csv的数据日志组件设计

2019-07-17

我们业务每天需要记录大量的日志数据,且这些数据十分重要,它们是公司收入结算的主要依据,也是数据分析部门主要得数据源,针对这么重要的日志,且高频率的日志,我们需要一个高性能且安全的日志组件,能保证每行日志格式完整性,我们设计了一个类 csv 的日志拼接组件,它的代码在这里 datalog。

它是一个可以保证日志各列完整性且高效拼接字段的组件,支持任意列和行分隔符,而且还支持数组字段,可是实现一对多的日志需求,不用记录多个日志,也不用记录多行。它响应一个 []byte 数据,方便结合其它主键写入数据到日志文件或者网络中。

more >>
  • pool
  • 日志
  • csv
  • join
  • go

展开全文 >>

【Go】使用压缩文件优化io (二)

2019-07-07

上一篇文章《使用压缩文件优化io (一)》中记录了日志备份 io 优化方案,使用文件流数据压缩方案优化 io 性能,效果十分显著。这篇文章记录数据分析前置清洗、格式化数据的 io 优化方案,我们有一台专用的日志前置处理服务器,所有业务日志通过这台机器从 OSS 拉取回来清洗、格式化,最后进入到数据仓储中便于后续的分析。

随着业务扩展这台服务器压力越来越大,高峰时数据延迟越来越厉害,早期也是使用 Python 脚本 + awk 以及一些 shell 命令完成相关工作,在数据集不是很大的时候这种方案很好,效率也很高,随着数据集变大,发现服务器负载很高,经过分析是还是 io 阻塞,依旧采用对数据流进行处理的方案优化io,以下记录优化的过程。

more >>
  • go
  • compress
  • io
  • 压缩
  • go

展开全文 >>

【Go】使用压缩文件优化io (一)

2019-06-30

最近遇到一个日志备份 io 过高的问题,业务日志每十分钟备份一次,本来是用 Python 写一个根据规则扫描备份日志问题不大,但是随着业务越来越多,单机上的日志文件越来越大,文件数量也越来越多,导致每每备份的瞬间 io 阻塞严重, CPU 和 load 异常的高,好在备份速度很快,对业务影响不是很大,这个问题会随着业务增长,越来越明显,这段时间抽空对备份方式做了优化,效果十分显著,整理篇文章记录一下。

more >>
  • go
  • compress
  • io
  • 压缩
  • go

展开全文 >>

【Go】获取用户真实的ip地址

2019-03-28

用户请求到达提供服务的服务器中间有很多的环节,导致服务获取用户真实的 ip 非常困难,大多数的框架及工具库都会封装各种获取用户真实 ip 的方法,在 exnet 包中也封装了各种 ip 相关的操作,其中就包含获取客户端 ip 的方法,比较实用的方法如下:

  • func ClientIP(r *http.Request) string ClientIP 尽最大努力实现获取客户端 IP 的算法。 解析 X-Real-IP 和 X-Forwarded-For 以便于反向代理(nginx 或 haproxy)可以正常工作。
  • func ClientPublicIP(r *http.Request) string ClientPublicIP 尽最大努力实现获取客户端公网 IP 的算法。 解析 X-Real-IP 和 X-Forwarded-For 以便于反向代理(nginx 或 haproxy)可以正常工作。
  • func HasLocalIP(ip net.IP) bool HasLocalIP 检测 IP 地址是否是内网地址
  • func HasLocalIPddr(ip string) bool HasLocalIPddr 检测 IP 地址字符串是否是内网地址
  • func RemoteIP(r *http.Request) string RemoteIP 通过 RemoteAddr 获取 IP 地址, 只是一个快速解析方法。
more >>
  • go
  • ip
  • net
  • client
  • RemoteAddr
  • go

展开全文 >>

【Go】IP地址转换:数字与字符串之间的转换

2019-03-25

IP 地址库中 IP 地址的保存格式一般有两种,一种是点分十进制形式(192.168.1.1),另一种是数字形式(3232235777),应用中,经常需要在这两种格式之间做转换。

针对这一个问题我在 exnet 扩展包里面实现可两者的转换的快捷方法:

  • func IP2Long(ip net.IP) (uint, error) IP2Long 把 net.IP 转为数值
  • func Long2IP(i uint) (net.IP, error) Long2IP 把数值转为 net.IP
  • func IPString2Long(ip string) (uint, error) IPString2Long 把 ip 字符串转为数值
  • func Long2IPString(i uint) (string, error) Long2IPString 把数值转为 ip 字符串

使用示例:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
package main

import (
"fmt"
"net"
"reflect"

"github.com/thinkeridea/go-extend/exnet"
)

func main() {
ip := "192.168.1.1"

n, _ := exnet.IPString2Long(ip)
s, _ := exnet.Long2IPString(n)

fmt.Println(n, s == ip)

Ip1 := net.ParseIP(ip) // 会得到一个16字节的byte,主要为了兼容ipv6
n, _ = exnet.IP2Long(Ip1)

Ip2, _ := exnet.Long2IP(n)

fmt.Println(n, reflect.DeepEqual(Ip1[12:], Ip2))
}
more >>
  • go
  • ip
  • net
  • ip2long
  • ip2number
  • go

展开全文 >>

12Next »
© 2021 戚银 京ICP备17038866号-1
Hexo Theme Yilia by Litten
  • 所有文章

tag:

  • chatops
  • devops
  • hubot
  • github
  • gitlab
  • slack
  • rocket.chat
  • linux
  • centos
  • VirtualBox
  • 读写锁
  • 死锁
  • net.http
  • http
  • pool
  • bytes
  • buffer
  • makeSlice
  • ioutil
  • go
  • strings
  • replace
  • unsafe
  • string
  • int
  • numerical
  • uintptr
  • proxy
  • git
  • shell
  • ip
  • net
  • ip2long
  • ip2number
  • client
  • RemoteAddr
  • compress
  • io
  • 压缩
  • substring
  • substr
  • utf8
  • 中文字符串截取
  • sync
  • once
  • OncePointer
  • BufferPool
  • strings.Replacer
  • closeOnce
  • slice
  • array
  • 缓存
  • 内存池
  • 日志
  • csv
  • join
  • round
  • half up
  • exmath
  • math