最新 | 最热门 | 最高评价

+0  Go泛型是怎么实现的?

Tag: Go
鸟窝 发于 2021年08月31日 18:36 | 点击: 165 | 展开摘要
Go 1.17中你就可以使用泛型了,可以参考我3月份的文章:Go 泛型尝鲜, 编译的时候需要加-gcflags=-G=3参数,而当前master分支,默认已经支持泛型,不需要加-G=3参数了。

你可以通过下面的步骤尝试go最新分支:

1
2

go get golang.org/dl/gotip
gotip download

编译代码的时候使用gotip替换go命令即可。

随着Go 1.17的发布,最近也涌现了很多的介绍Go泛型的文章,基本上都是简单介绍的文章。



查看全文: http://www.udpwork.com/item/18153.html

+0  一个select死锁问题

Tag: Technical | Golang
老王 发于 2021年08月29日 21:12 | 点击: 130 | 展开摘要
话说前几天我遇到了一个死锁问题,当时想了一些办法糊弄过去了,不过并没有搞明白问题的细节,周末想起来便继续研究了一下,最终便有了这篇文章。

让我们搞一段简单的代码来重现一下当时我遇到的问题:

package main

import "sync"

func main() {
var wg sync.WaitGroup
foo := make(chan int)
bar := make(chan int)
closing := make(chan struct{})

查看全文: http://www.udpwork.com/item/18152.html

+0  2021年Go生态圈rpc框架benchmark

Tag: Go
鸟窝 发于 2021年08月03日 09:54 | 点击: 306 | 展开摘要
有朋友问,每年年初的时候我会发布一个rpc的框架的大比拼,今年为啥没有了?

有几个原因,一是我去年下半年换了一份工作,熟悉新的业务耗费了很大精力,导致博客文章相对少了,开源的贡献也少了,二是rpcx我自己觉得性能已经很不错了没有想着进一步的优化,所以也没有做相应的benchmark比较。

前几个星期头条的同学推出他们的rpcx框架kitex,据说性能要比rpcx和grpc好很多,加上今年GopherChina2021大会上他们也分享了他们的netpoll的优化。

本来,

查看全文: http://www.udpwork.com/item/18048.html

+0  [译]编程语言内存模型

Tag: Go
鸟窝 发于 2021年07月14日 15:06 | 点击: 116 | 展开摘要
这是Russ Cox的第二篇Programming Language Memory Models。

如果你已经阅读了前一篇硬件内存模型,以及如果有Java内存模型或者C++内存模型的经验,本文还好理解,如果你没有相关经验,可能阅读起来比较费劲,建议先阅读一下相关的材料。论文有些词句比较难以理解,本人才学疏浅,有翻译不当之处欢迎批评指正。

编程语言内存模型回答了并行程序可以依靠什么行为以便它们的线程之间可以共享内存的问题。例如,考虑下面这个类似C语言的程序,其中x和done

查看全文: http://www.udpwork.com/item/18050.html

+0  [译]硬件内存模型

Tag: Go
鸟窝 发于 2021年07月14日 11:23 | 点击: 106 | 展开摘要
Russ Cox关于内存模型的系列文章之一。这是第一篇 Hardware Memory Models

简介: 童话之终局

很久以前,当每个人都写单线程程序的时候,让程序运行得更快最有效的方法之一是坐下来袖手旁观。下一代硬件和编译器的优化结果可以让程序像以前一样运行,只是速度会更快。在这个童话般的年代,有一个判断优化是否有效的简单测试方法:如果程序员不能区分合法程序的未优化执行结果和优化执行的结果之间的区别(除了速度的区别),那么这个优化就是有效的。也就是说,有效的优化不会

查看全文: http://www.udpwork.com/item/18052.html

+0  [译]更新Go内存模型

Tag: Go
鸟窝 发于 2021年07月14日 11:04 | 点击: 102 | 展开摘要
这是Russ Cox的系列论文的第三篇,也是最后一篇: Updating the Go Memory Model。

文章对 官方的Go内存模型做了一些补充和思考。

当前的Go语言内存模型是在2009年编写的,从那以后略有更新。很明显,至少有一些细节我们应该添加到当前的内存这个内存模型中,其中包括对竞态检测器的明确认可,以及关于sync/atomic中的API是如何同步程序的清晰声明。

这篇文章重申了Go的总体哲学和当前的内存模型,然后概述了我认为我们应该对Go内存模型进

查看全文: http://www.udpwork.com/item/18049.html

+0  深入Go Module之未说的秘密

Tag: Go
鸟窝 发于 2021年07月06日 20:40 | 点击: 100 | 展开摘要
正常情况下,我们的go.mod依赖库的版本都是符合语义化版本 2.0.0的版本格式,或者伪版本格式。在前面的文章我没有特别提到一点的事,Go使用服务端提交的日期和commit id生成的伪版本号是符合语义化版本号2.0.0的,因为语义化版本号中规定pre-release以连接号-加一连串以逗号分隔的标识符组成,标识符以字母数字和连接号组成,所以你看到-yyyyMMddhhmmss-comitid包含两个连接号,这是正常的。

go要求依赖库要么不包含go.mod,要么依赖库中

查看全文: http://www.udpwork.com/item/18051.html

+0  实战CGO

Tag: Technical | Golang
老王 发于 2021年07月03日 14:55 | 点击: 112 | 展开摘要
某项目要集成 PDF 文件的 OCR 功能,不过由于此功能技术难度太大,网络上找不到靠谱的开源实现,最终不得不选择 ABBYY FineReader Engine 的付费服务。可惜 ABBYY 只提供了 C++ 和 Java 两种编程语言的 SDK,而我们的项目采用的编程语言是 Golang,此时通常的集成方法是使用 C++ 或 Java 实现一个服务,然后在 Golang 项目里通过 RPC 调用服务,不过如此一来明显增加了系统的复杂度,好在 Golang 支持 CGO,让

查看全文: http://www.udpwork.com/item/18008.html

+0  深入Go Module之go.mod文件解析

Tag: Go
鸟窝 发于 2021年06月29日 13:26 | 点击: 382 | 展开摘要
昨天在GopherChina 2021大会上分享了《深入Go Module》,干货太多了,接下来的分几篇文章详细介绍下。

现在哪个新编程语言不都是提供库版本工具呢?Java、Python、nonjs、rust都有一套自己的库管理方法和库注册中心,不管它们的叫法如何。Go最初推出来的时候并没有一个库管理方式,而是采用GOPATH的方式,所有的项目都必须放在GOPATH下,不止一次有从其它语言比如Java转过过来的同学问我:"为什么我在我的一个文件夹下建的项目没法编译

查看全文: http://www.udpwork.com/item/17940.html

+0  深入Go Module之讨厌的v2

Tag: Go
鸟窝 发于 2021年06月28日 12:51 | 点击: 324 | 展开摘要
Go module不但遵循语义化版本规范 2.0.0,而且还更进一步,对语义化版本中的major还还赋予了更深的意义。

v0.X.X: 对于主版本号(major)是0的情况,隐含你当前的API还处于不稳定的状态,新的小版本可能不向下兼容

v1.X.X: 当前的API处于稳定状态,minor的增加只意味着新的feature的增加,API还是向下兼容的

v2.X.X: major的增加意味着API已经不向下兼容了

问题: 你知道在go module中,哪些版本号隐含当前A

查看全文: http://www.udpwork.com/item/17939.html

+0  使用 Go 实现 lock-free 的队列

Tag: Go
鸟窝 发于 2021年06月16日 10:34 | 点击: 194 | 展开摘要
队列(queue)是非常常用的一个数据结构,它只允许在表的前端(head)进行出队(dequeue)操作,而在表的后端(tail)进行入队(enqueue)操作。和栈数据结构一样,队列是一种操作受限制的线性表。进行插入操作的端称为队尾(tail),进行删除操作的端称为队头(header)。

在并发环境中使用队列,就必须考虑到多线程(多纤程)并发读写的问题,可能存在多个写(入队)操作线程,同时也可能存在多个线程读操作线程,在这种情况下,我们要保证数据的不丢失,不重复,而且也要

查看全文: http://www.udpwork.com/item/17413.html

+0  Multi-Master-Paxos: 3

Tag: algo | distributed | replication | paxos | multi-master | multi-leader | active-active | 分布式 | 多活 | 多主
张炎泼(xp) 发于 2021年06月14日 08:00 | 点击: 137 | 展开摘要
Background

200行代码实现paxos-kv
中介绍了一款非常简洁的分布式kv存储实现, 它是基于 classic-paxos
实现分布式一致性. 在 paxos的直观解释 中我们提到, 每次写入, 也就是每个 paxos 实例需要2轮 RPC 完成, 效率低.

一个常见的优化就是 mutli-paxos(或raft), 用一次 RPC 对多个实例运行 phase-1;
再对每个实例分别运行 phase-2, 这样均摊开销是一次 RPC 完成一次写入.
它通过

查看全文: http://www.udpwork.com/item/17943.html
|<<<1234567>>>| 一共60页, 716条记录