每日新闻

每日新闻

GoCN每日新闻资讯
有问必答

有问必答

Go相关的问题,技术相关的问题
文章分享

文章分享

技术文章分享,让知识传播给更多的人
招聘应聘

招聘应聘

为Gopher服务的招聘应聘平台

请问golang有没有成熟的 在线电商 框架?

有问必答angelina 回复了问题 • 3 人关注 • 1 个回复 • 2812 次浏览 • 2017-07-24 16:18 • 来自相关话题

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

每日新闻shingle 回复了问题 • 3 人关注 • 1 个回复 • 2534 次浏览 • 2017-07-24 15:14 • 来自相关话题

【北京】求区块链开发工程师/技术负责人--无需融资--信链科技

招聘应聘stirlingx 回复了问题 • 2 人关注 • 1 个回复 • 2376 次浏览 • 2017-07-24 14:58 • 来自相关话题

[杭州]青露科技招聘go后端开发工程师(实习/全职)

招聘应聘sospartan 发表了文章 • 0 个评论 • 1466 次浏览 • 2017-07-24 10:48 • 来自相关话题

基本要求: 1. 一年以上go开发经验,熟悉语言特性,有开发web应用、API服务的经验。 2. 有良好的编码风格,能单元测试、集成测试、CI等改进开发过程和质量。 3. 熟悉常用关系数据库(MySQL,PostgreSQL ...查看全部
基本要求:
1. 一年以上go开发经验,熟悉语言特性,有开发web应用、API服务的经验。
2. 有良好的编码风格,能单元测试、集成测试、CI等改进开发过程和质量。
3. 熟悉常用关系数据库(MySQL,PostgreSQL)的使用经验,能有意识得改进查询性能。
4. 熟悉Linux操作系统,了解常用管理操作。
5. 有良好的自学能力,对新技术能持续学习、保持好奇心,不断挖掘自身潜力。

优先:
1. 能使用Linux、MacOS作为日常工作系统。
2. 乐于分享,热衷于参与开源社区,曾参与过开源项目的开发。
3. 良好的英文阅读能力,善于使用Google、stackoverflow等来解决技术问题。

薪酬范围:5k~12k

关于团队:
核心成员均来自国内一线的高科技公司,拥有丰富的互联网创业和管理经验。目前项目处于早期的初创阶段,产品的方向是小学教育,我们立志于将互联网行业的技术、经验带到教育行业,通过新的技术和方式改进中国的基础教育。

工作地点:杭州文一西路恒生科技园
联系邮箱:juniordewtech@gmail.com

关于 Golang map 无序的问题

有问必答Mr_Wings 回复了问题 • 3 人关注 • 2 个回复 • 2190 次浏览 • 2017-07-24 10:10 • 来自相关话题

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

每日新闻trainee 回复了问题 • 2 人关注 • 1 个回复 • 2484 次浏览 • 2017-07-23 22:37 • 来自相关话题

GoCN Forum 网站的源代码是开源的吗

有问必答tupunco 回复了问题 • 2 人关注 • 1 个回复 • 1924 次浏览 • 2017-07-22 21:57 • 来自相关话题

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

每日新闻qiangmzsx 回复了问题 • 2 人关注 • 1 个回复 • 2113 次浏览 • 2017-07-22 10:41 • 来自相关话题

关于 二维码 解析

技术讨论stirlingx 回复了问题 • 9 人关注 • 13 个回复 • 5422 次浏览 • 2017-07-22 09:33 • 来自相关话题

Go 实现泛型展开以及展开时计算

Go开源项目taowen 发表了文章 • 0 个评论 • 1959 次浏览 • 2017-07-21 18:58 • 来自相关话题

实现代码: [https://github.com/v2pro/wombat/tree/master/fp](https://github.com/v2pro/wombat/tree/master/fp) # 泛型展开 ...查看全部
实现代码: [https://github.com/v2pro/wombat/tree/master/fp](https://github.com/v2pro/wombat/tree/master/fp)

# 泛型展开

泛型展开不是简单的类型替换。在C++中有模板偏特化,以及由此发展出来一系列实现编译期计算的奇技淫巧,直到最后以constexpr变成语言的一部分。D语言的static if也是类似的,在编译期实现了D语言的一个子集。在 Go 2.0 中即便支持了泛型,要达到D语言的高度,可能还需要很长的路要走。所以目前最佳的方案还是用代码生成的方案。但是纯手写的代码生成没有办法做到很复杂的泛型代码的组合,比如一个泛型函数调用另外一个泛型函数之类的。所以 wombat 的实现目标是设计一个能够支撑大规模代码生成的机制,使得复杂的utility能够被广泛复用。这些utility可能简单的如compare,max,复杂得如json编解码。

# 最简单的例子

定义一个泛型的函数

```golang
var compareSimpleValue = generic.DefineFunc("CompareSimpleValue(val1 T, val2 T) int").
Param("T", "the type of value to compare").
Source(`
if val1 < val2 {
return -1
} else if val1 == val2 {
return 0
} else {
return 1
}`)
```

测试一个泛型的函数

```golang
func init() {
generic.DynamicCompilationEnabled = true
}

func Test_compare_int(t *testing.T) {
should := require.New(t)
f := generic.Expand(compareSimpleValue, "T", generic.Int).
(func(int, int) int)
should.Equal(-1, f(3, 4))
should.Equal(0, f(3, 3))
should.Equal(1, f(4, 3))
}
```

注意,在init的时候,我们开启了动态编译。这样在测试的时候,实际上是直接在执行的时候生成代码,并用plugin的方式加载的。这样测试泛型代码就能达到和反射的实现一样的高效。

使用一个泛型的函数

```golang
func init() {
generic.Declare(compareSimpleValue, "T", generic.Int)
}

func xxx() {
f := generic.Expand(compareSimpleValue, "T", generic.Int).
(func(int, int) int)
f(3, 4)
}
```
因为没有开启动态编译,所以调用`generic.Expand`会失败。需要用 `go install github.com/v2pro/wombat/cmd/codegen` 编译出代码生成器。然后执行

```
codegen -pkg path-to-your-pkg
```

然后会在你的包下面生成 generated.go 文件。这样运行时`generic.Expand` 就不会报错了。

# 泛型展开时计算

如果需求不仅仅是支持int,还要支持int的指针。前面实现的函数模板是无法支持的。所以我们需要能够,在泛型展开的时候进行类型判断,选择不同的实现。

```golang
var ByItself = generic.DefineFunc("CompareByItself(val1 T, val2 T) int").
Param("T", "the type of value to compare").
Generators("dispatch", dispatch).
Source(`
{{ $compare := expand (.T|dispatch) "T" .T }}
return {{$compare}}(val1, val2)`)

func dispatch(typ reflect.Type) string {
switch typ.Kind() {
case reflect.Int:
return "CompareSimpleValue"
case reflect.Ptr:
return "ComparePtr"
}
panic("unsupported type: " + typ.String())
}
```

其中dispatch就是一个go语言实现的函数,可以在展开模板的时候被调用,用于选择具体的实现。然后调用expand来把对应的模板再展开,然后调用。

# 递归展开

ComparePtr其实无法确认自己一定是调用CompareSimpleValue。因为可能还有`**int`,以及`***int`这样的情况。所以,ComparePtr在对指针进行取消引用之后,再次调用CompareByItself进行递归展开模板。

```golang
func init() {
ByItself.ImportFunc(comparePtr)
}

var comparePtr = generic.DefineFunc("ComparePtr(val1 T, val2 T) int").
Param("T", "the type of value to compare").
ImportFunc(ByItself).
Source(`
{{ $compare := expand "CompareByItself" "T" (.T|elem) }}
return {{$compare}}(*val1, *val2)`)
```

`ByItself.ImportFunc(comparePtr)` 是为了避免循环引用自身而引入的。否则两个函数就会循环引用,导致编译失败。具有了这样的函数模板化的能力,我们可以把JSON编解码这样的复杂的utility也用模板的方式写出来。

# 泛型容器

除了支持模板函数之外,struct也可以加模板。写法如下:

```golang
var Pair = generic.DefineStruct("Pair").
Source(`
{{ $T1 := .I | method "First" | returnType }}
{{ $T2 := .I | method "Second" | returnType }}

type {{.structName}} struct {
first {{$T1|name}}
second {{$T2|name}}
}

func (pair *{{.structName}}) SetFirst(val {{$T1|name}}) {
pair.first = val
}

func (pair *{{.structName}}) First() {{$T1|name}} {
return pair.first
}

func (pair *{{.structName}}) SetSecond(val {{$T2|name}}) {
pair.second = val
}

func (pair *{{.structName}}) Second() {{$T2|name}} {
return pair.second
}`)
```

其中固定了一个模板参数叫,I。这个是指模板struct需要实现的interface。比如,如果用``来展开struct,对应的interface应该是:

```golang
type IntStringPair interface {
First() int
SetFirst(val int)
Second() string
SetSecond(val string)
}
```

使用的代码需要用这个interface来创建pair的实例:

```golang
func init() {
generic.DynamicCompilationEnabled = true
}

func Test_pair(t *testing.T) {
type IntStringPair interface {
First() int
SetFirst(val int)
Second() string
SetSecond(val string)
}
should := require.New(t)
intStringPairType := reflect.TypeOf(new(IntStringPair)).Elem()
pair := generic.New(Pair, intStringPairType).(IntStringPair)
should.Equal(0, pair.First())
pair.SetFirst(1)
should.Equal(1, pair.First())
}
```

golang有关于数据结构和算法的实现的相关入门的书么?

有问必答fiisio 回复了问题 • 7 人关注 • 5 个回复 • 5323 次浏览 • 2017-07-21 15:29 • 来自相关话题

GOLANG中DEFER, PANIC, RECOVER用法

回复

文章分享haohongfan 发起了问题 • 1 人关注 • 0 个回复 • 2459 次浏览 • 2017-07-21 11:37 • 来自相关话题

【上海】Strikingly (YC W13) 招聘 Backend Engineer / Devops Engineer

招聘应聘danielglh 发表了文章 • 1 个评论 • 1790 次浏览 • 2017-07-21 09:58 • 来自相关话题

[Strikingly](https://www.strikingly.com/) 是一个简单易用的建站平台,没有技术背景的用户也在很短的时间内创建和发布设计精美的网站。我们的产品自2012年8月发布以来增长迅速,第二个月就开始盈利。创始团队于2013年初进入 ...查看全部
[Strikingly](https://www.strikingly.com/) 是一个简单易用的建站平台,没有技术背景的用户也在很短的时间内创建和发布设计精美的网站。我们的产品自2012年8月发布以来增长迅速,第二个月就开始盈利。创始团队于2013年初进入 Y Combinator 孵化项目,是 YC 毕业的第一个中国团队,获得了来自 SV Angel,Index Ventures, FundersClub,创新工场等机构的投资。目前 Strikingly 的用户遍布全球200多个国家和地区,提供6种语言的应用界面和客户支持。

2016年4月,我们正式推出了中国版产品 [上线了sxl.cn](https://www.sxl.cn/),提供了更多符合本土国情和互联网生态的产品特性。

- 我们的团队:一支诞生于硅谷,扎根在中国,快速成长的国际化创业团队
- 我们的成员:一群执着于产品,以技术和设计为导向的年轻人
- 我们期待的:志同道合,乐观向上,保持谦逊,不断突破,热爱创造价值的你

![](https://nzr2ybsda.qnssl.com/images/12/FhttBsko3HzB391E9UVj7TN10rf9.jpeg?imageMogr2/strip/thumbnail/1200x9000%3E/quality/90!/interlace/1/format/jpeg)

对我们技术团队正在干什么感兴趣的请看:[Strikingly 团队2017技术展望](https://zhuanlan.zhihu.com/p/25229260)。

感兴趣的小伙伴们请发送简历至 jobs#strikingly.com 并注明来自 GoCN,也欢迎大家踊跃推荐,推荐成功有 1000 美金伯乐奖。

## 开放职位

### Backend Engineer

#### 职位描述

- 负责后端系统架构的设计和实现
- 负责后端服务性能的监控和优化
- 负责后端服务的高可用性
- 负责后端服务的安全性
- 与其他团队成员紧密沟通合作,共同完成项目

#### 职位要求

- 熟练掌握以下主流编程语言中的一种或几种
- Ruby
- Go
- Java
- Node.js
- C#
- Python
- Scala
- 熟练掌握以上主流编程语言对应的主流 Web 框架
- 掌握 Git 版本控制工具
- 了解常见设计模式和编程最佳实践
- 深刻理解 Web 应用相关的标准和最佳实践
- 扎实的计算机科学基础知识,熟悉操作系统,数据库、常见数据结构和算法,以及软件设计实践
- 熟悉 Linux / Unix 操作系统
- 熟练的英语读写能力
- 能迅速适应创业节奏和团队氛围

#### 加分项

- 熟悉 Ruby 和 Rails
- 熟悉主流 Ruby Web 服务器的性能调优
- Github 有后端项目超过 100 star,或给大型开源项目贡献过代码
- 具备丰富的 Web 应用微服务架构实践经验
- 具备丰富的 Web 应用高可用性实践经验
- 具备丰富的 Web 应用性能优化实践经验
- 具备丰富的 Web 应用安全实践经验
- 优秀的英语交流能力

### DevOps Engineer

#### 职位描述

- 负责系统和计算基础设施的搭建和维护
- 负责系统和计算基础设施的监控、问题排查和故障处理
- 负责设计、实现和优化内部容器平台
- 负责设计、实现和优化内部部署工作流
- 与其他技术团队成员紧密沟通合作,共同完成项目

#### 职位要求

- 熟悉 Linux / Unix 操作系统
- 熟练掌握一门 Linux / Unix 环境下的通用编程语言
- 掌握 Git 版本控制工具
- 了解容器相关知识
- 具备使用 Amazon Web Services / Google Cloud / Microsoft Azure 等云平台的经验
- 具备使用 Terraform / Ansible / Chef / Puppet 等运维自动化工具的经验
- 扎实的计算机科学基础知识,熟悉操作系统,数据库、常见数据结构和算法,以及软件设计实践
- 熟练的英语读写能力
- 快速学习成长,能迅速适应创业节奏和团队氛围

#### 加分项

- 熟练掌握 Go 编程语言
- 具备丰富的 Amazon Web Services 实战经验
- 精通 Docker 及其生态系统
- 具备丰富的容器平台构建和维护经验
- 熟练使用 Terraform
- 熟练使用 Ansible
- 设计并实现过开源的 DevOps 工具,或给大型开源项目贡献过代码
- 优秀的代码设计能力
- 优秀的英语交流能力

## 公司日常

TECH x 大学路

![](http://nzr2ybsda.qnssl.com/images/12/FrGuQLnXTpkxcJ40Z8CQ_JCLJ3rj.JPG?imageMogr2/strip/thumbnail/1200x9000%3E/quality/90!/interlace/1/format/jpeg)

![](http://nzr2ybsda.qnssl.com/images/12/FlieTWz295ExtMQVlpF6GC8Wzo2V.JPG?imageMogr2/strip/thumbnail/1200x9000%3E/quality/90!/interlace/1/format/jpeg)

![](http://nzr2ybsda.qnssl.com/images/12/Fo9ykTR6rvCttGppzWaCyOzWcPYu.JPG?imageMogr2/strip/thumbnail/1200x9000%3E/quality/90!/interlace/1/format/jpeg)

![](http://nzr2ybsda.qnssl.com/images/12/FsJvvEUOlT-NTIeI2RGxw3irtHsa.JPG?imageMogr2/strip/thumbnail/1200x9000%3E/quality/90!/interlace/1/format/jpeg)

![](http://nzr2ybsda.qnssl.com/images/12/FtJoGe-6nV2r6mV_dcVQxPK4Wa5_.JPG?imageMogr2/strip/thumbnail/1200x9000%3E/quality/90!/interlace/1/format/jpeg)

![](http://nzr2ybsda.qnssl.com/images/12/FmSukbJwVMxrCGH0HysyfnnRLZID.JPG?imageMogr2/strip/thumbnail/1200x9000%3E/quality/90!/interlace/1/format/jpeg)

每三个月一次脑洞大开的 Hackathon

![](https://nzr2ybsda.qnssl.com/images/12/Ft3IQcO95Fx5qqxjHYjWRP7bbxdv.jpg?imageMogr2/strip/thumbnail/1200x9000%3E/quality/90!/interlace/1/format/jpeg)

![](https://nzr2ybsda.qnssl.com/images/12/FrIPWyZJXBfhqNhsHGvraYLrouKD.jpg?imageMogr2/strip/thumbnail/1200x9000%3E/quality/90!/interlace/1/format/jpeg)

![](https://nzr2ybsda.qnssl.com/images/12/FlY-0vnnpIBotMHnQL1YdGtyBWQp.jpg?imageMogr2/strip/thumbnail/1200x9000%3E/quality/90!/interlace/1/format/jpeg)

参加各类技术大会

![](https://nzr2ybsda.qnssl.com/images/12/FogoJHsGe_uzIwZhGhFdAVydoEJv.png?imageMogr2/strip/thumbnail/1200x9000%3E/quality/90!/format/png)

![](https://nzr2ybsda.qnssl.com/images/12/FjIcXjzxTuDGWznjcfQ4kyQizFPi.png?imageMogr2/strip/thumbnail/1200x9000%3E/quality/90!/format/png)

吃喝玩乐

![](https://nzr2ybsda.qnssl.com/images/12/lqrfwREPYRAPFrJIWvEU4lQarP05.jpg?imageMogr2/strip/thumbnail/1200x9000%3E/quality/90!/interlace/1/format/jpeg)

![](https://nzr2ybsda.qnssl.com/images/12/Fo-sbgTCYbxvxdT7-YXbxgFXxhBW.jpg?imageMogr2/strip/thumbnail/1200x9000%3E/quality/90!/interlace/1/format/jpeg)

![](https://nzr2ybsda.qnssl.com/images/12/FkOnWKxkRfDeuqlm4OkBcZSwsbxK.jpg?imageMogr2/strip/thumbnail/1200x9000%3E/quality/90!/interlace/1/format/jpeg)

![](https://nzr2ybsda.qnssl.com/images/12/FtyTYyA1XYf-ek3tF_E7PBpKcSQv.jpeg?imageMogr2/strip/thumbnail/1200x9000%3E/quality/90!/interlace/1/format/jpeg)

感兴趣的小伙伴们请发送简历至 jobs#strikingly.com 并注明来自 GoCN,也欢迎大家踊跃推荐,推荐成功有 1000 美金伯乐奖。

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

回复

每日新闻astaxie 发起了问题 • 1 人关注 • 0 个回复 • 2828 次浏览 • 2017-07-21 09:22 • 来自相关话题

go的下划线

有问必答xkey 回复了问题 • 4 人关注 • 2 个回复 • 1647 次浏览 • 2017-07-21 09:15 • 来自相关话题