一周 Go World 新鲜事

mob604756f0bbf4 · · 784 次点击 · · 开始浏览    
这是一个创建于 的文章,其中的信息可能已经有所发展或是发生改变。

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

原文二维码

一周 Go World 新鲜事

02

一周 Go World 新鲜事

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

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

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

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

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

原文二维码

一周 Go World 新鲜事

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

原文二维码

一周 Go World 新鲜事

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

原文二维码

一周 Go World 新鲜事

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大咖交流群,或添加微信:liuxiaoyan-s 备注:入群;或加QQ群:692541889

784 次点击  
加入收藏 微博
暂无回复
添加一条新回复 (您需要 登录 后才能回复 没有账号 ?)
  • 请尽量让自己的回复能够对别人有帮助
  • 支持 Markdown 格式, **粗体**、~~删除线~~、`单行代码`
  • 支持 @ 本站用户;支持表情(输入 : 提示),见 Emoji cheat sheet
  • 图片支持拖拽、截图粘贴等方式上传