Go 语言中 runtime.KeepAlive() 方法的一些随笔

我在看 go101 网站的 [类型不安全指针](https://go101.org/article/unsafe.html)[(来源)](https://old.reddit.com/r/golang/comments/8ll6lf/how_to_safely_use_typeunsafe_pointers_in_go/) 一文时,偶然发现了 [runtime](https://golang.org/pkg/runtime/) 库的一个有趣的新方法 [runtime.KeepAlive()](h...阅读全文

Go语言中文网 2020-05-05 13:05:34 polaris

Go 中的 Goroutine 和其他并发处理方案的对比

Go 语言让使用 Goroutine 和通道变得非常有吸引力,作为在 Go 中进行并发的主要方式,它们是被有意识的提出的。因此对于你所遇到的任何与并发相关的问题,它们都可能成为首选方案。但是我不确定它们是否适合于我遇到的所有问题,我仍在考虑其中的平衡点。 通道和 Goroutine 对于查询共享状态(或从共享状态中获取某些信息)这类问题看起来似乎并不完全契合。假设你想要记录那些与服务端建立 TLS 通信失败的 SMTP 客户端的 IP,以便在 TLS 握手失败的情况下,不再提供 TLS 通...阅读全文

Go语言中文网 2020-05-05 12:25:11 anxk

关于 CGO 的字符串函数的解释

[cgo](https://github.com/golang/go/wiki/cgo) 的大量文档都提到过,它提供了四个用于转换 Go 和 C 类型的字符串的函数,都是通过复制数据来实现。在 CGo 的文档中有简洁的解释,但我认为解释得太简洁了,因为文档只涉及了定义中的某些特定字符串,而忽略了两个很重要的注意事项。我曾经踩过这里的坑,现在我要详细解释一下。 四个函数分别是: ```go func C.CString(string) *C.char func C.GoString...阅读全文

Go语言中文网 2020-05-05 12:20:46 lxbwolf

Go 切片的一种有趣内存泄漏方式

今天我在看 Prashant Varanasi 的 Go 发布会演讲:[使用火焰图进行生产分析](https://www.youtube.com/watch?v=aAhNDgEZj_U)(Analyzing production using Flamegraphs),在演讲开始的第 28 分钟他提到了一种涉及切片的有趣且棘手的内存泄漏。为了自我提升,我将在这里写一下该内存泄漏的一种形式,并说明它是如何发生的。 首先,对于像 Go 这样的垃圾收集语言来说,**内存泄漏是保留了对对象的非预期引...阅读全文

Go语言中文网 2020-05-05 12:15:45 dust347

Go 运行时调度器处理系统调用的巧妙方式

[goroutine](https://tour.golang.org/concurrency/1) 是 Go 的一个标志性特点,是被 Go 运行时所管理的轻量线程。Go 运行时使用[一个 M:N 工作窃取调度器](https://rakyll.org/scheduler/)实现 goroutine,将 Goroutine 复用在操作系统线程上。调度器有着特殊的术语用来描述三个重要的实体;G 是 goroutine,M 是 OS 线程(一个“机器 machine”),P 是“处理器(proces...阅读全文

Go语言中文网 2020-05-05 12:10:54 dust347

Go 各版本回顾

![Illustration created for “A Journey With Go”, made from *the original Go Gopher, created by Renee French.](https://raw.githubusercontent.com/studygolang/gctt-images2/master/Go-Retrospective/00.png) 对每一个开发者来说,Go 的发展历史是必须知道的知识。了解几年来每个发行版本的主要变化,有助于...阅读全文

Go语言中文网 2020-05-05 11:42:29 lxbwolf

Go语言sync包的应用详解

在并发编程中同步原语也就是我们通常说的锁的主要作用是保证多个线程或者 goroutine在访问同一片内存时不会出现混乱的问题。Go语言的sync包提供了常见的并发编程同步原语,上一期转载的文章《Golang 并发编程之同步原语》中也详述了 Mutex、RWMutex、WaitGroup、Once 和 Cond 这些同步原语的实现原理。今天的文章里让我们回到应用层,聚焦sync包里这些同步原语的应用场景,同时也会介绍sync包中的Pool和Map的应用场景和使用方法。话不多说,让我们开始吧。 sy...阅读全文

Segmentfault 2020-05-08 07:32:34 Kevin

unsafe 真就 unsafe 吗 - part1

## unsafe 包详解 在乌克兰的利沃夫举行的 [Lviv Golang community event](https://www.facebook.com/events/470065893928934/482981832637340/?notif_t=admin_plan_mall_activity&notif_id=1580732874088578) 中,我发表了一个关于 `unsafe` 包的演讲,这个演讲中我尝试回答了标题中提到的问题:`unsafe` 包究竟有多 unsafe...阅读全文

Go语言中文网 2020-05-05 11:22:21 Alex-liutao

华为云 路由器的天坑

问题在华为云服务器上使用Golang直接监听UDP端口,外部将无法访问这些端口,因为华为云服务器的路由不会允许外部与这些UDP端口直接通信。即便在配置了安全组以后亦是如此。解决方案Golang 建立连接后,使用 conn.Write() 写入部分数据即可(无需指定目的地)。如此一来,华为云的路由器便能放行此 UDP 端口。问题猜测华为云路由器的 NAT 算法应该是华为自己魔改的。尽管外网 IP 对 服务器内网IP是 1对1 的,但路由器对外部的访问存在限制。需要像 IP限制锥形 NAT 一样向往...阅读全文

简书 2020-05-05 05:32:43 鹿沐浔

go modules 初体验

之前有知道dep,vendor,glide等go的包管理方案,但没怎么用起来,modules是官方推出,看势头在后面的版本中也会持续改进,值得尝试。 modules modules在go的1.11版本中加入,并在Go 1.13中对模块进行了重大改进和更改。 开启模块 1.13版本前请务必开启模块 export GO111MODULE=auto 初始化 在你的项目目录中执行: go mod init 13sai/game 会生成go.mod module 13sai/game go 1.12 然后...阅读全文

Segmentfault 2020-05-07 11:32:34 13sai

Protobuf语法全解析

Protocol Buffers(protobuf)是一种语言无关,平台无关,可扩展的用于序列化结构化数据的方式——类似XML,但比XML更灵活,更高效。虽然平常工作中经常用到protobuf,但很多时候只是停留在基本语法的使用上,很多高级特性和语法还掌握不全,在阅读一些开源proto库的时候,总会看到一些平常没有使用过的语法,影响理解。 本文基于Go语言,总结了所有的proto3常用和不常用的语法和示例,助你全面掌握protobuf语法,加深理解,扫清源码阅读障碍。 Quick Start 使...阅读全文

掘金 2020年05月04日 水立方

Go语言(十九)日志采集项目之logagent开发(一)

日志采集项目之logagent开发(一) 项目结构 项目分为如下部分: logagent conf: 配置文件 kafka: kafka集成模块 tailf: 日志读取模块 main.go: 程序入口 xlog: 日志打印模块,参考https://blog.51cto.com/13812615/2490744 oconfig: 配置文件解析模块,参考:https://blog.51cto.com/13812615/2492150 logCollect/ ├── logagent │ ├── co...阅读全文

51CTO博客 2020-05-04 13:34:59 wx5b285b48ed74e

Golang UDP的连接性(网关如何阻碍Golang的UDP通信)

转自知乎专栏(防止挂掉):https://zhuanlan.zhihu.com/p/94680036golang中udp的连接性 曾经浮华装逼招雷劈​关注他golang中udp分为已连接和未连接两种,两者在发送、接收消息行为模式上有重大区别背景前段时间,我们组开发一个紧急需求,需要与其它部门某组进行协议交互,暂且称之为B组。 B组底层通信采用UDP形式,使用pb为传输协议,本来很简单的事情,可是联调过程中却遇到一个大坑,关于golang中udp的连接性问题。我们这边采用golang技术栈,以Di...阅读全文

简书 2020-05-04 23:32:44 鹿沐浔