GoCN每日新闻(2017-12-07)

回复

每日新闻data_worm 发起了问题 • 1 人关注 • 0 个回复 • 382 次浏览 • 5 天前 • 来自相关话题

golang 获取本地DNS

回复

有问必答flewliu 回复了问题 • 1 人关注 • 1 个回复 • 207 次浏览 • 5 天前 • 来自相关话题

慕课网招聘[15k-25k] golang /讲师

招聘应聘皇虫 回复了问题 • 3 人关注 • 3 个回复 • 325 次浏览 • 5 天前 • 来自相关话题

(开源)基于vue, react, node.js, go开发的微商城(含微信小程序)

开源程序zhaoyun4122 回复了问题 • 7 人关注 • 5 个回复 • 1753 次浏览 • 5 天前 • 来自相关话题

零拷贝读取文件成 Go 对象

开源程序taowen 发表了文章 • 2 个评论 • 173 次浏览 • 6 天前 • 来自相关话题

我们观察到从文件读取到go对象,需要两次拷贝:

  1. 从文件拷贝到内存,成为[]byte
  2. 从[]byte,按照格式进行读取,拷贝到go对象上

怎么样优化这个读取速度呢?

    ... 查看全部

我们观察到从文件读取到go对象,需要两次拷贝:



  1. 从文件拷贝到内存,成为[]byte

  2. 从[]byte,按照格式进行读取,拷贝到go对象上


怎么样优化这个读取速度呢?



  1. 利用mmap,把文件直接映射到内存,go允许把这片内存已经转化成[]byte来使用

  2. 直接在这个[]byte上“展开”go对象


所谓”展开“就是一个reinterpret cast,对一个指针的类型重新解读。


var bytes = []byte{
16, 0, 0, 0, 0, 0, 0, 0,
5, 0, 0, 0, 0, 0, 0, 0,
'h', 'e', 'l', 'l', 'o'}

假设有这样一个[]byte数组。这个是直接用mmap读取出来的。


var ptr = &bytes[0]

这个ptr就是这片内存区域的指针,指向了开头的第一个元素


type stringHeader struct {
Data uintptr
Len int
}

header := (*stringHeader)(unsafe.Pointer(ptr))

这样我们就把这个内存重新解读为了一个stringHeader了。利用stringHeader就可以构造出string来。


header.Data = uintptr(unsafe.Pointer(&bytes[16]))

把stringHeader的指针指向实际的hello数据部分。


str := (*string)(unsafe.Pointer(ptr))
fmt.Println(str) // "hello"

最后再把同一片内存区域解读为string类型,就得到了"hello"字符串了。整个解码过程只做了一次header.Data的更新,没有做任何内存分配。


相比Java来说,go允许我们使用go自己的heap外的内存。甚至允许把go的对象直接在这片内存上构造出来。这使得我们的应用可以和文件系统的缓存共享一片内存,达到内存利用率的最大化。同时相比protobuf/thrift来说,gocodec就是把cpu对值的内存表示(little endian的integer等),以及go语言对象的内存表示(stringHeader,sliceHeader)直接拷贝了,减少了编解码的计算成本。


完整的代码,欢迎star:bloomfilter_test.go


设计了一个编解码格式叫 github.com/esdb/gocodec


和protobuf的对比还没有测,和json相比,毫无悬念地不在一个量级上。


gocodec 200000 10893 ns/op 288 B/op 2 allocs/op
json 300 3746169 ns/op 910434 B/op 27 allocs/op

[北京]滴滴招聘golang工程师-特征系统

招聘应聘Xargin 回复了问题 • 10 人关注 • 17 个回复 • 2825 次浏览 • 6 天前 • 来自相关话题

【北京立水桥】在线教育公司招聘go后端 薪资18-30 K

招聘应聘themoonstone 回复了问题 • 7 人关注 • 6 个回复 • 577 次浏览 • 6 天前 • 来自相关话题

推荐一个简化搜索的web小工具“咸鱼SOS”【附上服务器端代码】

开源程序kaesalai 发表了文章 • 1 个评论 • 125 次浏览 • 6 天前 • 来自相关话题

咸鱼SOS 链接地址:http://xianyusos.fun

查看全部

咸鱼SOS 链接地址:http://xianyusos.fun



反正不要钱,不用白不用~ —— 周树人



使用咸鱼SOS可以简化搜索步骤,举个栗子,老师要小明同学在github中搜索“golang”关键字,查看golang的开源项目




  1. 普通小明会在浏览器的输入框中输入“github.com”,等网页显示出来后再找到搜索框搜索;




  2. 2B小明会先打开百度,在百度中搜索“github”,再选中github官网,等网页显示出来后再找到搜索框搜索;



  3. 文艺小明会把咸鱼SOS设置为首页或者加入书签,只用选中左边的GitHub,就可以直接使用中央的搜索框搜索github里的内容了。




服务端代码如下,请斧正:
server.go


package main

import (
"github.com/labstack/echo"
"xianyusos/handlers"
"io"
"html/template"
"time"
"gopkg.in/redis.v5"
"github.com/sirupsen/logrus"
"os"
"fmt"
)

const (
PERIOD = 1*time.Hour
)

type Template struct {
Templates *template.Template
}

func (t *Template) Render(w io.Writer, name string, data interface{}, c echo.Context) error {
return t.Templates.ExecuteTemplate(w, name, data)
}

func main() {
if err := getEnvs(); err != nil {
panic(err)
}
e := echo.New()
defer e.Close()
h, err := handlers.New()
if err != nil {
panic(err)
}
defer h.Client.Close()
e.Renderer = &Template{
Templates: template.Must(template.ParseGlob("views/*.html")),
}
logrus.SetOutput(os.Stdout)

go func() {
for {
time.Sleep(PERIOD)
if err := h.Client.Ping().Err(); err != nil {
logrus.Errorf("Error in h.Client.Ping: [%s].", err.Error())
h.Client = redis.NewClient(&redis.Options{
Addr: handlers.REDIS_ADDRESS,
Password: handlers.REDIS_PASSWORD,
MaxRetries: 5,
})
logrus.Infof("Reconnect redis[%s].", handlers.REDIS_ADDRESS)
}
for k, v := range h.VisitorsIp {
if err := h.Client.HSet("visitors", k, v).Err(); err != nil {
logrus.Errorf("Error in h.Client.Set: [%s].", err.Error())
continue
}
}
logrus.Info("Update the value of visitors success.")
}
}()

e.GET("/", h.Home)
e.GET("/:routerName", h.Search)
e.Static("/static", "views")
e.File("/favicon.ico", "views/katongxianyu.png")
//h.RouterName["163music"] = true
h.RouterName["github"] = true
h.RouterName["baidu"] = true
h.RouterName["bilibili"] = true
h.RouterName["iqiyi"] = true
h.RouterName["jd"] = true
h.RouterName["mooc"] = true
h.RouterName["qidian"] = true
h.RouterName["runoob"] = true
h.RouterName["segmentfault"] = true
h.RouterName["stackoverflow"] = true
h.RouterName["taobao"] = true
h.RouterName["weibo"] = true
h.RouterName["youku"] = true
h.RouterName["zhihu"] = true
e.Start(":8823")
}

func getEnvs() error {
handlers.REDIS_ADDRESS = os.Getenv("REDIS_ADDRESS")
if len(handlers.REDIS_ADDRESS) == 0 {
return fmt.Errorf("Env [REDIS_ADDRESS] is nil.")
}
handlers.REDIS_PASSWORD = os.Getenv("REDIS_PASSWORD")
if len(handlers.REDIS_PASSWORD) == 0 {
return fmt.Errorf("Env [REDIS_PASSWORD] is nil.")
}
return nil
}

handler.go


package handlers

import (
"github.com/labstack/echo"
"net/http"
"gopkg.in/redis.v5"
"sync"
"strings"
)

var (
REDIS_ADDRESS = "na.huanyu0w0.cn:2333"
REDIS_PASSWORD = "3.1415926"
)

type (
handler struct {
Client *redis.Client
Mux sync.Mutex
RouterName map[string]bool
VisitorsIp map[string]string
}
)

func New() (*handler, error) {
h := new(handler)
h.Client = redis.NewClient(&redis.Options{
Addr: REDIS_ADDRESS,
Password: REDIS_PASSWORD,
MaxRetries: 5,
})
var err error
h.VisitorsIp, err = h.Client.HGetAll("visitors").Result()
if err != nil {
return nil, err
}
h.Mux = sync.Mutex{}
h.RouterName = make(map[string]bool)
return h, nil
}

func (h *handler) Home(c echo.Context) error {
routerName := ""
for routerName = range h.RouterName {
break
}
return c.Redirect(http.StatusFound, "/"+routerName)
}

func (h *handler) Search(c echo.Context) error {
h.Mux.Lock()
ip := strings.Split(c.Request().RemoteAddr, ":")[0]
h.VisitorsIp[ip] = ip
h.Mux.Unlock()
routerName := c.Param("routerName")
if len(routerName) == 0 {
return echo.ErrNotFound
}
if b, ok := h.RouterName[routerName]; !ok && b == true {
return echo.ErrNotFound
}
return c.Render(http.StatusOK, routerName, len(h.VisitorsIp))
}

分享一个带 TTL 以及失效回调的 LRU 库. https://github.com/Akagi201/kvcache

开源程序Akagi201 发表了文章 • 0 个评论 • 108 次浏览 • 6 天前 • 来自相关话题

https://github.com/Akagi201/kvcache

完美达到我的业务需要的效果. 大家有同样的需求可以测试测试.

...

https://github.com/Akagi201/kvcache


完美达到我的业务需要的效果. 大家有同样的需求可以测试测试.


有问题一定向我反馈. akagi201@gmail.com

如何让goroutine占用cpu并由我(代码)控制来决定是否让出cpu?

有问必答lrita 回复了问题 • 2 人关注 • 2 个回复 • 207 次浏览 • 6 天前 • 来自相关话题

GoCN每日新闻(2017-12-06)

回复

每日新闻moss 发起了问题 • 1 人关注 • 0 个回复 • 397 次浏览 • 6 天前 • 来自相关话题

golang的goroutine调度到底是协作式的还是抢占式的?

有问必答sheepbao 回复了问题 • 5 人关注 • 3 个回复 • 340 次浏览 • 2017-12-05 22:21 • 来自相关话题

✔探探急招go开发,坐标北京,薪水20-50k/月

招聘应聘Sycorpiolar 发表了文章 • 2 个评论 • 274 次浏览 • 2017-12-05 20:41 • 来自相关话题

公司:探探

“探探”公司简介

2017最黑马的社交应用、最值钱的股权激励

探探,2015年“最受女性欢迎的社交app”奖项获得者。

探探,2015年拉勾“社交领域最佳雇主”奖项获得者。

查看全部

公司:探探


“探探”公司简介


2017最黑马的社交应用、最值钱的股权激励


探探,2015年“最受女性欢迎的社交app”奖项获得者。


探探,2015年拉勾“社交领域最佳雇主”奖项获得者。


探探,2015年百度“年度创新应用”奖项获得者。


探探,2015年中国互联网大会“最具行业先锋奖”奖项获得者。


探探,2015年中国互联网大会授予探探团队行业先锋人物获得者。


截至到目前,已成就14亿次陌生人之间的浪漫配对。


探探创造了一种惊喜感和趣味感十足的全新社交方式,在年轻人中迅速窜红,上线1年完成千万美金级的B轮融资,并于2016年5月完成3200万美元C轮融资。


社交是一个巨大的市场,目前投资商对探探的现估值上亿美金,并且扔处于高速增长期。我们希望凭借团队优秀的产品、技术实力,在这个领域做出一款出色的产品。


目前团队成员来自硅谷、BAT、知名创业公司等。我们希望参照硅谷的管理模式,创建一个工程师文化浓厚、重视工作幸福感、technology driven的公司。每年我们还会派出技术同事参加重磅级技术峰会,比如我司技术参加PostgreSQL2015年欧洲技术分享会,并参与重要演讲。


福利概要:


1.入职可配Macbook Pro;


2.有期权,入职满12个月后,期权可变现;


3.弹性工作制;国际化的工作氛围;


4.季度调薪;


5.七险一金;


6.股票期权;


7.免费三餐。


岗位:后端开发(go)


地点:北京市朝阳区光华路soho二期d座


薪水:20-50k/月,全员持股


投递邮箱:kele.yue@aliyun.com


概况:后端(go)开发工程师的主要工作:功能开发,性能优化,架构改造,分三个定位:初级,中级,高级


初级后端开发职位:一句话概括:在别人的指导下,可以完成模块级的开发


中级后端开发:一句话概括:能独立完成模块级的设计和开发


高级后端开发:一句话概括:系统级的掌控者


岗位职责:


1.采用Go语言(Golang)开发稳健可扩展的后端程序;(语言不限:C/C++, JAVA,python等都可以,有意愿转成Go语言开发)


2.基于SOA架构,为各类项目需求设计架构,开发后端所有功能服务,同团队成员合作并积极提出建议和反馈;


3.通过单元测试、自动化以及代码审查等提升优化代码质量;


4.积极参与各种头脑风暴会议并对用到的技术、算法和产品功能提出意见和建议;


5.同产品和设计团队协作,理解用户需求,归纳功能用例,并转化为高效的技术解决方案;


6.重点及难点技术攻坚,并按时交付研究成果。


岗位要求:


1.1-7年的实际项目开发经验;


2.本科及以上学历,计算机相关专业,全面的计算机理论基础,综合能力较强者可降低学历要求;


3.具备按时完成项目开发与交付的能力;


4.工作认真负责有责任心,追求细节和极致,有解决各类疑难问题的强烈愿望;


5.具备扎实的OOP及相关软件开发技能,能根据架构要求,开发设计可扩展、可复用、高性能的功能模块;


6.具备数据库(特别是关系型数据库MySQL,PostgreSQL等)及相关知识的实际应用和优化经验,能始终保持对新技术的学习热情;


7.具备Linux/Unix平台下的编程和操作经验,熟悉一种或者多种脚本语言(Python, Perl或者Shell等。

beego config 配置\n字符串输出后不被解析

回复

有问必答qingfeng 发起了问题 • 1 人关注 • 0 个回复 • 117 次浏览 • 2017-12-05 16:56 • 来自相关话题

golang 实现的配置中心有哪些?

有问必答javasgl 回复了问题 • 4 人关注 • 2 个回复 • 204 次浏览 • 2017-12-05 13:57 • 来自相关话题