golang
bdss58
这个作者很懒,什么都没留下…
展开
-
go 内存模型和内存顺序(memory model and memory order in go)
内存模型首先,官方文档有大致介绍总结下来:建议多个goroutines 并发修改数据时候,那就串行化。具体可以用go 经典的channel,再不济用sync包里的 mutex 或者 atomic 也行。如果你很屌,不想串行化并发控制,那么注意一下几点:1. happens before至于 happens before 和 happens after 的具体定义,可以看官方文档。要知道,单 goroutine 下,hapens before 顺序就是程序书写顺序。2. package in原创 2021-08-14 19:21:26 · 477 阅读 · 0 评论 -
golang 标准库 http 的 client 为什么必须手动关闭 resp.Body
使用 golang http client 请求,我们通常是这么干的resp, err := http.Get(...)if err != nil {..}defer resp.Body.Close()为啥必须 resp.Body.Close() 呢?回答这个问题其实需要回答两个问题:resp.Body.Close() 做了啥?为啥这么做?1 resp.Body.Clo...原创 2019-10-06 14:21:36 · 5273 阅读 · 0 评论 -
golang 标准库 http client 超时设置
golang 官方提供的 http 包里的 http client 可以通过一下两种方法设置超时(其他一些精细的超时控制比如设置 transport 里的 dial connect 的超时时间不在这里讨论)。1 client.Timeout// 设置1s超时cli := http.Client{Timeout: time.Second}2 req.WithContext// 设置1s超...原创 2019-10-05 23:23:44 · 17032 阅读 · 0 评论 -
使用 dlv 调试 golang 程序
使用 dlv 前取消编译时优化go build -gcflags='all=-N -l'取消测试用例编译时优化go test -c --gcflags='all=-N -l'使用 dlvto be continue…原创 2018-10-17 22:03:39 · 1957 阅读 · 0 评论 -
LRU缓存算法
注:本文使用golang语言表述。LRU(least recently used)是一个缓存剔除策略算法,在缓存容量不足的时候,将最不常用的一个或多个缓存相剔除,腾出空间以便后续缓存使用。实现一个LRU cacheLRU cache可以使用两个数据结构来表示。一个hashtable,用来存储需要存储的缓存项,这样,get/set操作可以在O(1)时间复杂度下完成。一个d...原创 2018-06-13 11:43:46 · 470 阅读 · 0 评论 -
golang http 请求
1. 使用默认http.Client{}使用标准库的http.Post方法。postData = `{ "name": "jian", "age":20}`resp, err := http.Post("url", "application/json", bytes.NewBuffer(postData))if err != nil { //}...原创 2018-04-26 16:50:09 · 455 阅读 · 0 评论 -
Processes, threads and goroutines
Processes进程起初,计算机在批处理模式下一个一个地执行任务。后来在上世纪60年代开发了多任务分时操作系统,在70年代 被广泛用于网络服务器、ftp、telnet、以及后来地httpd上,httpd使用fork子进程的方式来处理每个网连接。在分时系统上,系统记录当前执行进程的状态,然后在不同进程之间快速切换以便让CPU去执行每个进程,这样便达到了并发执行的效果。切换的过程称作上下文切...原创 2018-03-16 17:17:52 · 443 阅读 · 0 评论 -
golang c10k问题
不好意思,英文原文地址找不到了go 内置 network poller2002那年,Dan Kegel 提出了c10k问题。简单来说,就是在当今硬件水平下如何写出一个支持上万并发的tcp server。这个问题提出之后,出现了多线程和事件循环来提高服务器性能。多线程对调度和内存压力比较大,虽然事件循环有所缓解,但是有复杂的回调。go继承了两者的优点。Go 应对 ...翻译 2018-03-15 17:04:06 · 1075 阅读 · 0 评论 -
golang 整数常量INT_MAX INT_MIN最大值最小值
在C语言中,有标准库limits.h定义了一些最大最小值常量,例如int类型的最大值常量INT_MAX,最小值常量INT_MIN,无符号整型uint类型的最大值常量UINT_MAXgolang的标准库里没有定义这些变量。不过可以用位操作运算,轻松定义这些常量。无符号整型uint其最小值是0,其二进制表示的所有位都为0,const UINT_MIN uint = 0其最大值的二进制表示的所有位都为1,原创 2017-10-29 22:40:24 · 44960 阅读 · 2 评论 -
golang实现generator
python和nodejs都可以是使用yield关键字,实现一个generator。python版:def generator(): n = 0 while True: yield n n = n+1for i in generator(): if i < 10: print(i) else: bre原创 2017-07-07 20:12:20 · 1850 阅读 · 0 评论 -
golang实现python xrange方法
在python中,可以使用xrange方法方便地获取一个整数列表:for v in xrange(5): print(v)输出:01234golang没有原生的xrange方法,不过可以使用golang的channel配合goroutine实现一个xrange方法。 下面是一个简易版的:func xRangeInt(count int) chan int { ch := m原创 2017-07-10 15:41:52 · 1025 阅读 · 0 评论 -
golang 结构体和 json 相互转换时的 key 匹配问题
使用json.Unmarshal时,结构体的每一项必须是导出项(import field)也是就说结构体的key的首字母必须大写。package mainimport "fmt"import "encoding/json"type Person struct { name string age int}func main() { jsonstr := `原创 2016-12-20 15:43:29 · 11199 阅读 · 0 评论 -
tcp client and server
sample tcp servertcp server 在处理请求前需要做两个事情: 1. 监听 2. 获取tcp 连接使用net包中的net.Listen()方法获取监听器。 使用Accept()方法获取tcp连接simple_tcp_server.gopackage mainimport ( "bufio" "log" "net")func main() {原创 2017-02-12 21:43:02 · 763 阅读 · 0 评论 -
golang and json
用惯了javascript,用惯了json,突然在golang使用json。还是感觉浑身不舒服。 官方上有简单的[介绍]。https://blog.golang.org/json-and-go在没有指定具体数据类型时,json package默认解析任意json object成如下数据类型: bool, 对应json中的 booleans float64, 对应json中的 number原创 2016-07-26 14:09:04 · 547 阅读 · 0 评论 -
用go run命令启动main package中的多个文件
通常在main package中只有一个main.go文件,里面有程序的入口函数main()。 使用 go run main.go 就可以跑起程序了。但是如果main.go文件比较长,希望将main.go拆分多个文件,比如在main package下,有a.go , b.go和main.go。 这个时候再用 go run main.go就会报错。使用 go run *.go可以原创 2016-11-16 01:51:57 · 17154 阅读 · 3 评论