Go
文章平均质量分 78
Go语言相关
ethannotlazy
这个作者很懒,什么都没留下…
展开
-
Golang sync.Once 源码浅析
本文分析了Golangsync.Once源码,并由此引申,简单讨论了单例模式的实现、atomic包的作用和 Java volatile 的使用。sync.Once。原创 2023-02-19 17:15:25 · 639 阅读 · 1 评论 -
Golang map源码浅析
设计概述runtime/map.go开头描述了map的设计要点。一个map是一个哈希表(hashtable);数据被组织成bucket数组,每个bucket最多8个键值对;哈希值的低位用于选择bucket下标,每个bucket包含哈希值的若干高位,用于定位一个bucket内的键值对;如果多于八个键被哈希到一个bucket中,将一个额外的bucket连接到其后面(拉链法);当哈希表需要扩容时,分配一个两倍大小的bucket数组;在扩容后,bucket被增量地从旧的bucket数组移到新的buc原创 2022-03-14 23:41:30 · 1208 阅读 · 0 评论 -
Go HTTP服务器源码浅析
简单服务器 Demo在 Go 编写一个服务器非常简单:func main() { http.HandleFunc("/", func(writer http.ResponseWriter, request *http.Request) { writer.Write([]byte("hello, world!")) }) http.ListenAndServe(":8080", nil)}之后便可以访问:~ curl localhost:8080/hello, world!也可以用原创 2022-02-26 11:45:48 · 1336 阅读 · 0 评论 -
Go的五种mock技术
简介良好的单元测试不仅可以在代码发布前验证代码是否可用,并且可以保护代码在以后的某一次修改中功能不被破坏。好的单元测试需要有自我隔离、可靠、无状态等特性。以下介绍五种 mock 技术。1. Higher-Order Functions当需要 mock 一个包级别函数的时候使用。以下代码打开一个数据库连接:func OpenDB(user, password, addr, db string) (*sql.DB, error) { conn := fmt.Sprintf("%s:%s@%s/%s"原创 2022-01-16 16:07:39 · 2439 阅读 · 0 评论 -
Go并发模式之Pipelines
简介Go的并发原语使构建流数据pipeline变得容易,流数据pipeline可以有效地利用I/O和多个CPU。本文介绍了此类pipeline的示例,强调了操作失败时出现的微妙之处,并介绍了干净地处理故障的技术。何为pipeline一个pipeline是指一系列用通道连接的阶段,每个阶段是一组运行同一个函数的go协程,在每一个阶段中的go协程:从上游管道接收数据在数据上执行一些操作,生成新的值将数据发到下游管道中例子:平方数第一个阶段将给定的数发到管道中,第二个阶段从管道接收数字,取平方原创 2021-11-16 15:14:26 · 1056 阅读 · 0 评论 -
Go并发模式之Context
简介在Go语言实现的服务器中,每个到达的请求被一个新的go协程处理。请求处理器经常开启额外的go协程访问后端,例如数据库、RPC服务。这一组服务同一个请求的go协程通常需要访问单个请求的某些值,例如终端用户的身份、权限token、请求的最后期限。context包让同一个请求处理的go协程间传值更为方便。它还能够在处理一个请求的一组go协程间传递取消信号、截止时间。ContextContext接口的源码如下:// Context的方法可以被并发调用type Context interface {原创 2021-11-15 17:01:43 · 510 阅读 · 0 评论 -
6.824 Lab 1: MapReduce
lab源地址简介根据MapReduce Paper构造一个MapReduce系统。该系统主要包括master和worker。master主要负责分发任务、处理worker故障;worker主要负责根据map、reduce函数读写文件。思路任务分发:master将需要完成的任务放到通道中,让worker从通道中拿取任务,根据任务类型完成相应的操作。容错:master跟踪每个任务的完成情况,如果一个任务超过一定时间仍未完成,则重新发布该任务。完成情况判断:master直接判断当前目录的目标文件是否存原创 2021-07-31 14:15:38 · 380 阅读 · 0 评论 -
go自定义排序规则
实现自定义排序规则定义一个结构体及计算其length的函数:type Track struct { Title string Artist string Album string Year int Length time.Duration}func length(s string) time.Duration { d, err := time.ParseDuration(s) if err != nil { panic(s) } return d}样例数据如下:var原创 2021-04-15 22:17:04 · 931 阅读 · 0 评论 -
Go设计并发Web爬虫
串行爬虫首先用最简单的方法实现crawler,用串行的方式爬取页面:在这里用广度优先搜索,将搜索到的页面放到一个队列中,每次再从队列中拿出一个页面进行处理。//crawl函数能爬取一个页面的所有链接func crawl(url string) []string { fmt.Println(url) list, err := links.Extract(url) if err != nil { log.Print(err) } return list}func main() {原创 2021-04-16 23:47:04 · 330 阅读 · 0 评论 -
Go实现并发缓存
首先用一个例子演示函数记忆:// A Memo caches the results of calling a Func.type Memo struct { f Func cache map[string]result}// Func is the type of the function to memoize.type Func func(key string) (interface{}, error)type result struct { value interface原创 2021-04-18 21:28:01 · 460 阅读 · 2 评论