1.11 flag库
今天介绍一个库flag,命令行程序常用,用来接受参数的。
var (
intflag int
boolflag bool
stringflag string
)
func init() {
flag.IntVar(&intflag, "intflag", 0, "int flag value")
flag.BoolVar(&boolflag, "boolflag", false, "bool flag value")
flag.StringVar(&stringflag, "stringflag", "default", "string flag value")
}
func main() {
flag.Parse()
fmt.Println("int flag:", intflag)
fmt.Println("bool flag:", boolflag)
fmt.Println("string flag:", stringflag)
}
用法
./main.exe -intflag 12 -boolflag 1 -stringflag test
接收了三个参数,输出:
int flag: 12
bool flag: true
string flag: test
init
函数里写了参数的默认值,参数输入帮助。
作业
- 自行研究如何输出参数帮助
- 抢答boolflag的默认值是什么
1.12 viper库
今天要介绍的是viper一个常用的配置读取包。github.com/spf13/viper
,它支持:
- 设置默认值
- 从
JSON
、TOML
、YAML
、HCL
、envfile
和Java
属性配置文件读取 - 实时监控和重新读取配置文件(可选)
- 从环境变量、命令行参数、缓冲区读取
- 从远程配置系统(
etcd
或Consul
)读取,并观察变化 - 显式配置值
简单来说只要三步,指定配置文件,初始化,使用,大家下来自己了解。
宋跑跑:viper
好用 但是目前不支持环境变量数组解析。
Mike: uber 出了不少好东西,果然还是要有业务沉淀,才能造出好用的轮子。
1.13 协程池
大家觉得Go有必要有协程池吗?
学过GMP
和理解Goroutine
的同学应该了解其消耗资源极低,所以实际上即用即销毁,没必要弄。
有些人会把池子拿来做限流、限制并发等操作,这个时候是需要的,比如超高并发低延时的case
,比如做网关,可能同时会启动很多Go程但又同时在运行的情况。
网上有用waitgroup
+channel
做了一个,实际上是利用chan的大小加上context的来控制的
源码 https://github.com/remeh/sizedwaitgroup
引用知乎问题:https://www.zhihu.com/question/302981392
核心代码是是下面的,大家自己研究,有不懂的问我
s.AddWithContext(context.Background())
//还有
select {
case <-ctx.Done():
return ctx.Err()
case s.current <- struct{}{}:
break
}
1.16 异常处理
在 Go
语言里是没有 try catch
的概念的,因为 try catch
会消耗更多资源,而且不管从 try
里面哪个地方跳出来,都是对代码正常结构的一种破坏。
所以 Go
语言的设计思想中主张: 如果一个函数可能出现异常,那么应该把异常作为返回值,没有异常就返回 nil
。
每次调用可能出现异常的函数时,都应该主动进行检查,并做出反应,这种 if
语句术语叫卫述语句。
所以异常应该总是掌握在我们的手上,保证每次操作产生的影响达到最小,保证程序即使部分地方出现问题,也不会影响整个程序的运行,及时的处理异常,这样就可以减轻上层处理异常的压力。
同时也不要让未知的异常使你的程序崩溃。
PS: panic recover
语句文中没有说,只能在同一个Go
程中进行recover
,且在defer
中使用recover
时不得用调用函数的方式把recover
统一抽出来共用。
1.17 Go能做什么事情
今天想和大家Go能做什么事情。
我个人认为Go
实际上不适合专门做web
,因为Go
的 主要应用领域就是云原生,kubernetes
、prometheus
都是应用了Go
作为开发语言。特别是kubernetes operator
,其对kubernetes
的扩展,使得Go
在云原生大行其道。
javaer
把它当java
写,pythoner
拿他当py
写,十个人有十种写法。每个人的理解都不同。
网友的想法云原生中比较重要的几点:
- 微服务、容器、持续交付,在Java体系中表现得其实很好,但是资源占用控制上面还是不足(指那种没有经过特殊优化的);
PHP
又压根没往这方向发展;.Net
开源的时间太晚;- 这时候一个主打性能、资源占用少、“工程规范且简单”的语言出来,拉了几个大佬背书,还是
google
亲儿子,所以就推起来了。 - 另外
golang
也确实不负众望,搭建起来了一些生态环境,比如容器docker
和容器编排的尽头K8S
; - 生态一旦形成,如果想入局,那真得融入了。
就传统B/S
或者C/S
的web
开发来说,其实Go
一点也不爽,但一但围绕云原生搞一些周边,不管爽不爽,都要沾点Go
。
Go
的好处是入门简单,做业务需求的情况下,不涉及太多高级语法。
Go
发展到现在,越来越多的开发者不断的生产工具,框架,百花齐放,所以我们应该保持开源热情,掌握和了解这些框架以备未来使用方便,工作提效。
过年了,Go技术群的每日一Go暂停分享,等年后恢复啦~!年后恢复后每周发表每日一Go。第一期期刊就到这里啦~!
评论