yoko blog

learn and live


  • 首页

  • lal文档

  • 关于我

  • 友链

  • 站内搜索

[译] Go语言的协程,系统线程以及CPU管理

发表于 2019-12-04 | 分类于 Go
| 热度:
| 字数统计: 1.2k

题图

本文基于Go 1.13

创建系统线程以及在系统线程间切换,会对程序的内存和性能造成较大的开销。Go的目标是尽量利用CPU多核资源。设计之初就考虑了高并发性。

M,P,G 模型

阅读全文 »

Go创建对象时,如何优雅的传递初始化参数

发表于 2019-11-27 | 分类于 Go
| 热度:
| 字数统计: 2.3k

Go创建对象时,如何优雅的传递初始化参数?这里所说的优雅,指的是:

  1. 支持传递多个参数
  2. 参数个数、类型发生变化时,尽量保持接口的兼容性
  3. 参数支持默认值
  4. 具体的参数可根据调用方需关心的程度,决定是否提供默认值

Go并不像c++和python那样,支持函数默认参数。所以使用Go时,我们需要一种方便、通用的手法来完成这件事。

Go的很多开源项目都使用Option模式,但各自的实现可能有些许细微差别。

本文将通过一个渐进式的demo示例来介绍Option模式,以及相关的一些思考。本文将内容切分为10个小模块,如果觉得前面的铺垫冗余,想直接看Option模式的介绍,可以从小标题七开始阅读。

零

阅读全文 »

Go内存管理个人笔记

发表于 2019-11-23 | 分类于 Go
| 热度:
| 字数统计: 36

个人笔记,还没写完,

Go内存管理

阅读全文 »

[译] Go语言内存管理与分配

发表于 2019-11-07 | 分类于 Go
| 热度:
| 字数统计: 1.1k

题图

本文基于Go 1.13

Go程序的内存从申请阶段到不再使用后的释放阶段都由Go标准库自动管理。尽管管理工作不需要开发者参与,但是Go对内存管理的底层实现做了非常好的优化,里面充满了有意思的知识点,还是值得我们学习的。

从堆上申请内存

阅读全文 »

[译] Go开源项目BigCache如何加速并发访问以及避免高额的GC开销

发表于 2019-11-02 | 分类于 Go
| 热度:
| 字数统计: 2.5k

几天前,我读了一篇关于BigCache的文章,我对它是如何做到以下两点十分感兴趣:

  • 加速并发访问
  • 避免高额的GC开销

于是我去阅读了它的代码。我觉得它的做法很赞,所以我写了这篇文章来与你分享。

BigCache 是一个快速,支持并发访问,自淘汰的内存型缓存,可以在存储大量元素时依然保持高性能。BigCache将元素保存在堆上却避免了GC的开销。 —— 摘自《BigCache README 中的简介》

1
2
3
4
5
6
7
8
9
10
// BigCache README 中的简单使用示例

import "github.com/allegro/bigcache"

cache, _ := bigcache.NewBigCache(bigcache.DefaultConfig(10 * time.Minute))

cache.Set("my-unique-key", []byte("value"))

entry, _ := cache.Get("my-unique-key")
fmt.Println(string(entry))

BigCache github地址

并发访问

阅读全文 »

给Go程序加入编译版本时间等信息

发表于 2019-10-26 | 分类于 Go
| 热度:
| 字数统计: 1.4k

先看效果

1
2
3
4
5
6
$./myapp -v
GitCommitLog=d97d098e5bb4ad38a2a7968f273a256e10a0108f mod bininfo comment
GitStatus=cleanly
BuildTime=2019.10.26.194341
GoVersion=go version go1.13 darwin/amd64
runtime=darwin/amd64

myapp 是一个演示用的 demo 程序,输入 -v 参数运行时,打印出程序的一些信息。以上信息对应的说明如下:

阅读全文 »

[译] TCP的SYN队列和Accept队列

发表于 2019-10-15 | 分类于 网络编程
| 热度:
| 字数统计: 1.7k

关于两个队列

整体流程图

首先我们必须明白,处于“LISTENING”状态的TCP socket,有两个独立的队列:

  • SYN队列(SYN Queue)
  • Accept队列(Accept Queue)

这两个术语有时也被称为“reqsk_queue”,“ACK backlog”,“listen backlog”,甚至“TCP backlog”,但是这篇文章中我们使用上面两个术语以免造成混淆。

SYN队列

阅读全文 »

Go语言源码阅读之bytes.Buffer

发表于 2019-10-09 | 分类于 Go
| 热度:
| 字数统计: 1.7k

Go标准库中的bytes.Buffer(下文用Buffer表示)类似于一个FIFO的队列,它是一个流式字节缓冲区。

我们可以持续向Buffer尾部写入数据,从Buffer头部读取数据。当Buffer内部空间不足以满足写入数据的大小时,会自动扩容。

伸缩策略

阅读全文 »

[译] Go语言测试进阶版建议与技巧

发表于 2019-09-12 | 分类于 Go
| 热度:
| 字数统计: 1.5k

阅读本篇文章前,你最好已经知道如何写基本的单元测试。本篇文章共包含3个小建议,以及7个小技巧。

建议一,不要使用框架

阅读全文 »

[译] Go语言结构体中属性的顺序将影响结构体的大小

发表于 2019-09-01 | 分类于 Go
| 热度:
| 字数统计: 382

在Go语言中,结构体的大小取决于内部属性的类型以及它们的排列顺序。

1
2
3
4
5
6
struct {
a bool
b int32
c string
d string
}

上面这个结构体的大小和下面这个结构体的大小是不同的,尽管它们只是属性的定义顺序不同。

阅读全文 »
1…456…10
yoko

93 日志
10 分类
36 标签
RSS
GitHub

开源项目
🍀 lal: Go 直播服务器.
🍀 naza: Go 基础库.
🍀 libchef: c++ 基础库.
© 2019 — 2021 yoko 京ICP备19024469号
0%