一周 Go World 新鲜事

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

原文二维码  

640?wx_fmt=png

02

Go学习笔记(雨痕学堂)下卷 初始化 

在并发编程时,CPU 处理器数量是重要的决定性参数。它决定了我们应该采取什么样的并行策略,甚至会影响架构设计。也因为如此,我们要知道相关函数(runtime.NumCPU)返回的是物理核数量,还是包含超线程(Hyper-Threading)的结果。

超线程技术是利用特殊指令,在单个物理核内虚拟多个逻辑处理器。这有点像多线程,将等待时间挖掘出来执行其他任务,以提升整体性能。可问题在于,多个逻辑处理器毕竟共享某些资源,某些时候可能适得其反拖累执行效率,比如缓存刷新等等。

程序员应该对硬件体系,以及操作系统有些基本认识。

出自GoCN每日新闻(2018-06-09)

原文链接:https://mp.weixin.qq.com/s/_PbNrKkL3Wr3TEiPjX-X6g

原文二维码

640?wx_fmt=png

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

原文二维码

640?wx_fmt=png

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

原文二维码

640?wx_fmt=png

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")
	}}

出自GoCN每日新闻(2018-06-10)

原文链接:http://blog.7rule.com/2018/06/10/gobox-scache-lcache.html

原文二维码

640?wx_fmt=png


2018年的 Gopher Meetup 将在深圳开启巡回第一站,这一次邀请了很多新的讲师给大家一起交流分享Go的使用经验〜

点击阅读原文报名参加

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值