01
大道至简—GO语言最佳实践
2007年,受够了C++煎熬的Google首席软件工程师Rob Pike纠集Robert Griesemer和Ken Thompson两位牛人,决定创造一种新语言来取代C++, 这就是Golang。出现在21世纪的GO语言,虽然不能如愿对C++取而代之,但是其近C的执行性能和近解析型语言的开发效率以及近乎于完美的编译速度,已经风靡全球。特别是在云项目中,大部分都使用了Golang来开发,不得不说,Golang早已深入人心。而对于一个没有历史负担的新项目,Golang或许就是个不二的选择。
出自GoCN每日新闻(2018-06-08)
原文链接:https://mp.weixin.qq.com/s/hE7ecSywWY8SxoQV0OwBQg
原文二维码
02
在并发编程时,CPU 处理器数量是重要的决定性参数。它决定了我们应该采取什么样的并行策略,甚至会影响架构设计。也因为如此,我们要知道相关函数(runtime.NumCPU)返回的是物理核数量,还是包含超线程(Hyper-Threading)的结果。
超线程技术是利用特殊指令,在单个物理核内虚拟多个逻辑处理器。这有点像多线程,将等待时间挖掘出来执行其他任务,以提升整体性能。可问题在于,多个逻辑处理器毕竟共享某些资源,某些时候可能适得其反拖累执行效率,比如缓存刷新等等。
程序员应该对硬件体系,以及操作系统有些基本认识。
出自GoCN每日新闻(2018-06-09)
原文链接:https://mp.weixin.qq.com/s/_PbNrKkL3Wr3TEiPjX-X6g
原文二维码
03
GO语言学习笔记-缓冲区Channels和线程池
前讨论的所有channel都是不带缓冲区的,因此读取和写入都会被阻塞。创建一个带缓冲区的channel也是可能的,这种channel只有在缓冲区满后再写入或者读取一个空的channel时才会被阻塞。
创建一个带缓冲区的channel需要一个额外的参数容量来表明缓冲区大小:
ch := make(chan type, capacity)
上面代码中的 capacity 需要大于0,如果等于0的话则是之前学习的无缓冲区channel。
出自GoCN每日新闻(2018-06-09)
原文链接:https://juejin.im/entry/5b1a239de51d45067a72955e
原文二维码
04
Golang之sync.Map源码分析
众所周知,go普通的map是不支持并发的,换而言之,不是线程(goroutine)安全的。博主是从golang 1.4开始使用的,那时候map的并发读是没有支持,但是并发写会出现脏数据。golang 1.6之后,并发地读写会直接panic:
fatal error: concurrent map read and map write
package mainfunc main() {
m := make(map[int]int) go func() { for {
_ = m[1]
}
}() go func() { for {
m[2] = 2
}
}() select {}
}
出自GoCN每日新闻(2018-06-10)
原文链接:https://juejin.im/post/5b1b3d785188257d45297d0a
原文二维码
05
Gobox中的simplecache和levelcache
今天来说下gobox中的simplecache和levelcache
simplecache
simplecache提供了一个简单的内存kv
用法示例
package mainimport (
"github.com/goinbox/crypto"
"github.com/goinbox/simplecache"
"fmt"
"time"
"strconv")func main() {
sc := simplecache.NewSimpleCache()
for i := 0; i < 10000; i++ {
key := crypto.Md5String([]byte(strconv.Itoa(i)))
sc.Set(key, i, 3*time.Second)
v, ok := sc.Get(key)
if !ok || v != i { fmt.Println(v, ok)
}
}
time.Sleep(4 * time.Second)
allKeysExpires := true
for i := 0; i < 10000; i++ {
key := crypto.Md5String([]byte(strconv.Itoa(i)))
v, ok := sc.Get(key)
if ok || v == i {
fmt.Println(v, ok)
allKeysExpires = false
}
}
if allKeysExpires {
fmt.Println("all keys have expired")
}}
有疑问加站长微信联系(非本文作者)