当前位置: 首页 > news >正文

青岛外贸假发网站建设/高清免费观看电视网站

青岛外贸假发网站建设,高清免费观看电视网站,别人做网站要把什么要过来,网站开发合同缴纳印花税吗我来给你讲一个故事...1986 年,Knuth[1] 编写了一个程序来演示文学式编程[2] 。这段程序目的是读取一个文本文件,找到 n 个最常使用的单词,然后有序输出这些单词以及它们的频率。Knuth 写了一个完美的 10 页程序。Doug Mcllory 看到这里然后写…

我来给你讲一个故事...

1986 年,Knuth[1] 编写了一个程序来演示文学式编程[2]

这段程序目的是读取一个文本文件,找到 n 个最常使用的单词,然后有序输出这些单词以及它们的频率。Knuth 写了一个完美的 10 页程序。

Doug Mcllory 看到这里然后写了 tr -cs A-Za-z '' | tr A-Z a-z | sort | uniq -c | sort -rn | sed ${1}q 。

现在是 2019 年了,为什么我还要给你们讲一个发生在 33 年前(可能比一些读者出生的还早)的故事呢?计算领域已经发生了很多变化了,是吧?

林迪效应[3] 是指如一个技术或者一个想法之类的一些不易腐烂的东西的未来预期寿命与他们的当前存活时间成正比。太长不看版——老技术还会存在。

如果你不相信的话,看看这些:

  • oh-my-zsh[4] 在 GitHub 上已经快有了 100,000 个 星星了
  • 《命令行中的数据科学》[5]
  • 命令行工具能够比你的 Hadoop 集群快 235 倍[6]
  • ...

现在你应该被说服了吧, 让我们来讨论以下怎么使你的 Go 命令行程序变得友好。

设计

当你在写命令行应用程序的时候, 试试遵守 基础的 Unix 哲学[7]

  • 模块性规则:编写通过清晰的接口连接起来的简单的部件
  • 组合性规则:设计可以和其他程序连接起来的程序
  • 缄默性规则:当一个程序没有什么特别的事情需要说的时候,它就应该闭嘴

这些规则能指导你编写做一件事的小程序。

  • 用户需要从 REST API 中读取数据的功能 ?他们会将 curl 命令的输出通过管道输入到你的程序中
  • 用户只想要前 n 个结果 ?他们可以把你的程序的输出结果通过管道输入到 head 命令中
  • 用户指向要第二列数据 ?如果你的输出结果以 tab 为分割, 他们就可以把你的输出通过管道输入到 cut 或 awk 命令

如果你没有遵从上述要求 , 没有结构性的组织你的命令行接口 , 你可能会像下面这种情况一样的停止。

d5df653d0a972c5c845f28ab71821c65.png

帮助

让我们来假定你们团队有一个叫做 nuke-db 的实用工具 。你忘了怎么调用它然后你:

$ ./nuke-db --helpdatabase nuked (译者注:也就说本意想看使用方式,但却直接执行了)

OMG!

使用 flag 库[8] ,你可以用额外的两行代码添加对于 --help 的支持。

package mainimport ( "flag" // extra line 1 "fmt")func main() { flag.Parse() // extra line 2 fmt.Println("database nuked")}

现在你的程序运行起来是这个样子:

$ ./nuke-db --helpUsage of ./nuke-db:$ ./nuke-dbdatabase nuked

如果你想提供更多的帮助 , 使用 flag.Usage

package mainimport ( "flag" "fmt" "os")var usage = `usage: %s [DATABASE]Delete all data and tables from DATABASE.`func main() { flag.Usage = func() {  fmt.Fprintf(flag.CommandLine.Output(), usage, os.Args[0])  flag.PrintDefaults() } flag.Parse() fmt.Println("database nuked")}

现在 :

$ ./nuke-db --helpusage: ./nuke-db [DATABASE]Delete all data and tables from DATABASE.

结构化输出

纯文本是通用的接口。然而,当输出变得复杂的时候, 对机器来说处理格式化的输出会更容易。最普遍的一种格式当然是 JSON。

一个打印的好的方式不是使用 fmt.Printf 而是使用你自己的既适合于文本也适合于 JSON 的打印函数。让我们来看一个例子:

package mainimport ( "encoding/json" "flag" "fmt" "log" "os")func main() { var jsonOut bool flag.BoolVar(&jsonOut, "json", false, "output in JSON format") flag.Parse() if flag.NArg() != 1 {  log.Fatal("error: wrong number of arguments") } write := writeText if jsonOut {  write = writeJSON } fi, err := os.Stat(flag.Arg(0)) if err != nil {  log.Fatalf("error: %s", err) } m := map[string]interface{}{  "size":     fi.Size(),  "dir":      fi.IsDir(),  "modified": fi.ModTime(),  "mode":     fi.Mode(), } write(m)}func writeText(m map[string]interface{}) { for k, v := range m {  fmt.Printf("%s: %v", k, v) }}func writeJSON(m map[string]interface{}) { m["mode"] = m["mode"].(os.FileMode).String() json.NewEncoder(os.Stdout).Encode(m)}

那么

$ ./finfo finfo.gomode: -rw-r--r--size: 783dir: falsemodified: 2019-11-27 11:49:03.280857863 +0200 IST$ ./finfo -json finfo.go{"dir":false,"mode":"-rw-r--r--","modified":"2019-11-27T11:49:03.280857863+02:00","size":783}

处理

有些操作是比较耗时的,一个是他们更快的方法不是优化代码,而是显示一个旋转加载符或者进度条。不要不信我,这有一个来自 Nielsen 的研究[9] 的引用

看到运动的进度条的人们会有更高的满意度体验而且比那些得不到任何反馈的人平均多出三倍的愿意等待时间。

旋转加载

添加一个旋转加载不需要任何特别的库

package mainimport ( "flag" "fmt" "os" "time")var spinChars = `|/-`type Spinner struct { message string i       int}func NewSpinner(message string) *Spinner { return &Spinner{message: message}}func (s *Spinner) Tick() { fmt.Printf("%s %c ", s.message, spinChars[s.i]) s.i = (s.i + 1) % len(spinChars)}func isTTY() bool { fi, err := os.Stdout.Stat() if err != nil {  return false } return fi.Mode()&os.ModeCharDevice != 0}func main() { flag.Parse() s := NewSpinner("working...") for i := 0; i 

运行它你就能看到一个小的旋转加载在运动。

进度条

对于进度条, 你可能需要一个额外的库如 github.com/cheggaaa/pb/v3

package mainimport ( "flag" "time" "github.com/cheggaaa/pb/v3")func main() { flag.Parse() count := 100 bar := pb.StartNew(count) for i := 0; i 

结语

现在差不多 2020 年了,命令行应用程序仍然会存在。它们是自动化的关键,如果写得好,能提供优雅的“类似乐高”的组件来构建复杂的流程。

我希望这篇文章将激励你成为一个命令行之国的好公民。


http://www.lbrq.cn/news/1469539.html

相关文章:

  • 邯郸企业做网站报价/郑州网站seo服务
  • 广州市网站公司/线上广告接单平台
  • 青岛在线制作网站/长沙seo行者seo09
  • 网站是用dw做的吗/品牌全案营销策划
  • 为什么要给企业建设网站/微信营销方式
  • 做企业培训的网站/网络推广服务费
  • 网站制作公司 知乎/友情链接交换平台免费
  • 电商网站策划书/打开百度一下
  • 制作企业网站的app/石家庄seo扣费
  • phpcms v9网站建设入门/磁力天堂最佳搜索引擎入口
  • wordpress 福利源码/六年级下册数学优化设计答案
  • 中英文网站建设费用/做网站用什么软件
  • 张家界做网站的人/日本樱花免m38vcom费vps
  • 长沙网站建设/哪些网站可以seo
  • 高校网站开发/昭通网站seo
  • 如何做网站竞品分析/友情链接交换方式有哪些
  • 免费网站建设制作哪家公司好/百度关键词优化排名
  • 绍兴网站建设哪好/seo模拟点击软件
  • 公司网站要怎么做/有哪些可以免费推广的平台
  • 嘉兴做网站优化哪家好/中国互联网公司排名
  • 深圳市住房和建设委员会网站/外链相册
  • 烟台网站建设开发/百度账号登录入口
  • 营销型网站建设哪个好/seo搜索引擎是什么
  • 怎样做外国石雕产品网站/seo优化方案报价
  • 怎么在阿里巴巴网站做公司/今日头条新闻视频
  • 郑州专业制作网站多少钱/类似凡科建站的平台
  • 网站建设公司线下推广/网络舆情管理
  • wordpress 改网站域名/廊坊seo排名
  • 烟台做网站/美国最新新闻头条
  • 长沙网站建设的公司/如何写推广软文
  • python:以支持向量机(SVM)为例,通过调整正则化参数C和核函数类型来控制欠拟合和过拟合
  • React ahooks——副作用类hooks之useThrottleFn
  • 开源工具FossFLOW,绘制技术图表
  • 小杰数据结构(four day)——藏器于身,待时而动。
  • 【PHP】接入百度AI开放平台人脸识别API,实现人脸对比
  • Gitee