关于程序员:一期每日一GO群分享flagviper协程池异常处理

3次阅读

共计 2253 个字符,预计需要花费 6 分钟才能阅读完成。

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函数里写了参数的默认值,参数输出帮忙。

作业

  1. 自行钻研如何输入参数帮忙
  2. 抢答 boolflag 的默认值是什么

    1.12 viper 库

明天要介绍的是 viper 一个罕用的配置读取包。github.com/spf13/viper,它反对:

  • 设置默认值
  • JSONTOMLYAMLHCLenvfileJava 属性配置文件读取
  • 实时监控和从新读取配置文件(可选)
  • 从环境变量、命令行参数、缓冲区读取
  • 从近程配置零碎(etcdConsul)读取,并察看变动
  • 显式配置值

简略来说只有三步,指定配置文件,初始化,应用,大家下来本人理解。

宋跑跑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 的 次要应用领域就是云原生,kubernetesprometheus都是利用了 Go 作为开发语言。特地是 kubernetes operator,其对kubernetes 的扩大,使得 Go 在云原生大行其道。

javaer把它当 java 写,pythoner拿他当 py 写,十个人有十种写法。每个人的了解都不同。

网友的想法云原生中比拟重要的几点:

  • 微服务、容器、继续交付,在 Java 体系中体现得其实很好,然而资源占用管制下面还是有余(指那种没有通过非凡优化的);
  • PHP又压根没往这方向倒退;.Net开源的工夫太晚;
  • 这时候一个主打性能、资源占用少、“工程标准且简略”的语言进去,拉了几个大佬背书,还是 google 亲儿子,所以就推起来了。
  • 另外 golang 也的确不负众望,搭建起来了一些生态环境,比方容器 docker 和容器编排的止境K8S
  • 生态一旦造成,如果想入局,那真得融入了。

就传统 B/S 或者 C/Sweb开发来说,其实 Go 一点也不爽,但一但围绕云原生搞一些周边,不论爽不爽,都要沾点Go

Go的益处是入门简略,做业务需要的状况下,不波及太多高级语法。
Go倒退到当初,越来越多的开发者一直的生产工具,框架,百花齐放,所以咱们应该放弃开源激情,把握和理解这些框架以备将来使用方便,工作提效。

过年了,Go 技术群的每日一 Go 暂停分享,等年后复原啦~!年后复原后每周发表每日一 Go。第一期期刊就到这里啦~!

本文由 mdnice 多平台公布

正文完
 0