go语言从人们到实践 go语言的诞生( 二 )


4、Paas云平台领域:Kubernetes和Docker Swarm等;
5、分布式存储领域:etcd、Groupcache、TiDB、Cockroachdb、Influxdb等;
6、区块链领域:区块链里面有两个明星项目以太坊和fabric都使用Go语言;
7、容器虚拟化:大名鼎鼎的Docker就是使用Go语言实现的;
8、爬虫及大数据:Go语言天生支持并发,所以十分适合编写分布式爬虫及大数据处理 。
为什么要使用 Go 语言?Go 语言的优势在哪里?1、简单易学 。
Go语言的作者本身就很懂C语言,所以同样Go语言也会有C语言的基因,所以对于程序员来说 , Go语言天生就会让人很熟悉,容易上手 。
2、并发性好 。
Go语言天生支持并发,可以充分利用多核,轻松地使用并发 。这是Go语言最大的特点 。
描述
Go的语法接近C语言 , 但对于变量的声明有所不同 。Go支持垃圾回收功能 。Go的并行模型是以东尼·霍尔的通信顺序进程(CSP)为基?。扇±嗨颇P偷钠渌镅园∣ccam和Limbo,但它也具有Pi运算的特征,比如通道传输 。
在1.8版本中开放插件(Plugin)的支持,这意味着现在能从Go中动态加载部分函数 。
与C++相比 , Go并不包括如枚举、异常处理、继承、泛型、断言、虚函数等功能,但增加了 切片(Slice) 型、并发、管道、垃圾回收、接口(Interface)等特性的语言级支持 。
Go语言实践模式 - 函数选项模式(Functional Options Pattern)大家好,我是小白,有点黑的那个白 。
最近遇到一个问题,因为业务需求,需要对接第三方平台.
而三方平台提供的一些HTTP(S)接口都有统一的密钥生成规则要求.
为此我们封装了一个独立的包 xxx-go-sdk 以便维护和对接使用.
其中核心的部分是自定义HTTP Client,如下:
一些平台会要求appKey/appSecret等信息,所以Client结构体就变成了这样,这时参数还比较少, 而且是必填的参数,我们可以提供构造函数来明确指定 。
看起来很满足,但是当我们需要增加一个 Timeout 参数来控制超时呢?
或许你会说这还不简单,像下面一样再加一个参数呗
那再加些其他的参数呢?那构造函数的参数是不是又长又串,而且每个参数不一定是必须的,有些参数我们又会考虑默认值的问题 。
为此,勤劳但尚未致富的 gophers 们使用了总结一种实践模式
首先提取所有需要的参数到一个独立的结构体 Options,当然你也可以用 Configs 啥的.
然后为每个参数提供设置函数
这样我们就为每个参数设置了独立的设置函数 。返回值func(*Options)看着有点不友好,我们提取下定义为单个Option调整一下代码
当我们需要添加更多的参数时,只需要在 Options 添加新的参数并添加新参数的设置函数即可 。
比如现在要添加新的参数 Timeout
这样后续不管新增多少参数,只需要新增配置项并添加独立的设置函数即可轻松扩展,并且不会影响原有函数的参数顺序和个数位置等 。
至此,每个选项是区分开来了,那么怎么作用到我们的 Client 结构体上呢?
首先,配置选项都被提取到了 Options 结构体重,所以我们需要调整一下 Client 结构体的参数
其次 , 每一个选项函数返回 Option,那么任意多个就是 ...Option,我们调整一下构造函数 NewClient 的参数形式,改为可变参数,不再局限于固定顺序的几个参数 。
然后循环遍历每个选项函数 , 来生成Client结构体的完整配置选项 。
那么怎么调用呢?对于调用方而已,直接在调用构造函数NewClient()的参数内添加自己需要的设置函数(WithXXX)即可
当需要设置超时参数,直接添加 WithTimeout即可,比如设置3秒的超时

推荐阅读