一周 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

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




本文来自:51CTO博客

感谢作者:mob604756f0bbf4

查看原文:一周 Go World 新鲜事


相关阅读 >>

企业项目迁移Go-zero全攻略(二)

Golang如何升级?

Golang版本1哪年发明的

18 Golang结构体详解(四)

tidb-lite: 用于 Golang 数据库相关代码的单元测试

Golang面向对象编程之继承&虚基类【组合&接口】

Go语言 continue 语句

[Go] Golang happen before 的保证原则

Golang 协程并发编程

Golang读写文件的几种方法

更多相关阅读请进入《Go》频道 >>




打赏

取消

感谢您的支持,我会继续努力的!

扫码支持
扫码打赏,您说多少就多少

打开支付宝扫一扫,即可进行扫码打赏哦

分享从这里开始,精彩与您同在

评论

管理员已关闭评论功能...