具体步骤:
将源码文件解压缩到/usr/local目录,如果解压到其他目录,需要自己设置GOROOT
运行bash脚本,如果运行正常会获得你的操作系统和cpu信息,自动编译安装
cobra是一个提供简单接口来创建强大的现代CLI界面的库类似git git tools,cobra也是一个应用程序,它会生成你的应用程序的脚手架来快速开发基于cobra的应用程序
cobra提供:
cobra建立在命令、参数、标志的结构之上
commands代表动作,args是事物,flags是动作的修饰符
最好的应用程序在使用时读起来就像句子,所以呢,用户直观地知道如何与它们交互
模式如下:APPNAME VERB NOUN --ADJECTIVE. or APPNAME COMMAND ARG --FLAG(APPNAME 动词 名词 形容词 或者 APPNAME 命令 参数 标志)
一些真实世界的好例子可以更好地说明这一点
kubectl 命令更能体现APPNAME 动词 名词 形容词
如下的例子,server 是command,port是flag
这个命令中,我们告诉git 克隆url
命令是应用程序的中心点,应用程序支持的每一个交互都包含在一个命令中,命令可以有子命令,也可以运行操作
在上面的例子中,server是命令
更多关于cobra.Command
flag是一种修改命令行为的方式,cobra支持完全兼容POSIX标志,也支持go flag package,cobra可以定义到子命令上的标志,也可以仅对该命令可用的标志
在上面的命令中,port是标志
标志的功能由 pflag library 提供,pflag library是flag标准库的一个分支,在添加POSIX兼容性的同时维护相同的接口.
使用cobra很简单,首先,使用go get按照最新版本的库,这个命令会安装cobra可执行程序以及库和依赖项
下一步,引入cobra到应用程序中
虽然欢迎您提供自己的组织,但通常基于Cobra的应用程序将遵循以下组织结构:
在Cobra应用程序中,main.go文件通常非常简单.它有一个目的:初始化Cobra.
使用cobra生成器
cobra提供了程序用来创建你的应用程序然后添加你想添加的命令,这是将cobra引入应用程序最简单的方式
这儿 你可以发现关于cobra的更多信息
要手动实现cobra,需要创建一个main.go 和rootCmd文件,可以根据需要提供其他命令
Cobra不需要任何特殊的构造器.只需创建命令.
理想情况下,您可以将其放在app/cmd/root.go中:
在init()函数中定义标志和处理配置
例子如下,cmd/root.go:
创建main.go
使用root命令,您需要让主函数执行它.为清楚起见,Execute应该在根目录下运行,尽管它可以在任何命令上调用.
可以定义其他命令,通常每个命令在cmd/目录中都有自己的文件.
如果要创建版本命令,可以创建cmd/version.go并用以下内容填充它:
如果希望将错误返回给命令的调用者,可以使用RunE.
然后可以在execute函数调用中捕获错误.
标志提供修饰符来控制操作命令的操作方式.
由于标志是在不同的位置定义和使用的,所以呢我们需要在外部定义一个具有正确作用域的变量来分配要使用的标志.
有两种不同的方法来分配标志.
标志可以是"持久"的,这意味着该标志将可用于分配给它的命令以及该命令下的每个命令.对于全局标志,在根上指定一个标志作为持久标志.
也可以在本地分配一个标志,该标志只应用于该特定命令.
默认情况下,Cobra只解析目标命令上的本地标志,而忽略父命令上的任何本地标志.通过启用Command.TraverseChildren,Cobra将在执行目标命令之前解析每个命令上的本地标志.
使用viper绑定标志
在本例中,持久标志author与viper绑定.注意:当用户未提供--author标志时,变量author将不会设置为config中的值.
更多关于 viper的文档
Flags默认是可选的,如果希望命令在未设置标志时报告错误,请根据需要进行标记:
持久性Flags
可以使用命令的Args字段指定位置参数的验证.
内置了以下验证器:
在下面的示例中,我们定义了三个命令.两个是顶级命令,一个(cmdTimes)是顶级命令之一的子命令.在这种情况下,根是不可执行的,这意味着需要一个子命令.这是通过不为"rootCmd"提供"Run"来实现的.
我们只为一个命令定义了一个标志.
有关标志的更多文档,请访问
对于一个更完整的例子更大的应用程序,请检查 Hugo .
当您有子命令时,Cobra会自动将help命令添加到应用程序中.当用户运行"应用程序帮助"时,将调用此函数.此外,help还支持所有其他命令作为输入.例如,您有一个名为"create"的命令,没有任何附加配置;调用"app help create"时,Cobra将起作用.每个命令都会自动添加"-help"标志.
以下输出由Cobra自动生成.除了命令和标志定义之外,不需要任何东西.
帮助就像其他命令一样.它周围没有特殊的逻辑或行为.事实上,你可以提供你想提供的.
您可以为默认命令提供自己的帮助命令或模板,以用于以下功能:
当用户提供无效的标志或无效的命令时,Cobra通过向用户显示"用法"来响应.
你可以从上面的帮助中认识到这一点.这是因为默认帮助将用法作为其输出的一部分嵌入.
您可以提供自己的使用函数或模板供Cobra使用.与帮助一样,函数和模板也可以通过公共方法重写:
如果在root命令上设置了version字段,Cobra会添加一个顶级的'--version'标志.运行带有"-version"标志的应用程序将使用版本模板将版本打印到标准输出.可以使用cmd.SetVersionTemplate(s string)函数自定义模板.
可以在命令的主运行函数之前或之后运行函数.PersistentPreRun和PreRun函数将在运行之前执行.PersistentPostRun和PostRun将在运行后执行.如果子函数不声明自己的函数,则它们将继承Persistent*Run函数.这些函数按以下顺序运行:
输出:
当发生"未知命令"错误时,Cobra将打印自动建议.这使得Cobra在发生拼写错误时的行为类似于git命令.例如:
如果需要在命令中禁用建议或调整字符串距离,请使用:
or
您还可以使用SuggestFor属性显式设置将为其建议给定命令的名称.这允许对在字符串距离方面不接近的字符串提供建议,但在您的一组命令中是有意义的,并且对于某些您不需要别名的字符串.例子:
Cobra可以基于子命令、标志等生成文档.请在 docs generation文档 中阅读更多关于它的信息.
Cobra可以为以下shell生成shell完成文件:bash、zsh、fish、PowerShell.如果您在命令中添加更多信息,这些补全功能将非常强大和灵活.在 Shell Completions 中阅读更多关于它的信息.
有很多教程是关于Go的sql.DB类型和如何使用它来执行SQL数据库查询的.但大多数内容都没有讲述 SetMaxOpenConns() , SetMaxIdleConns() 和 SetConnMaxLifetime()方法, 您可以使用它们来配置sql.DB的行为并改变其性能.
转自:
整理:go语言中文文档:
在本文我将详细解释这些设置的作用,并说明它们所能产生的(积极和消极)影响.
一个sql.DB对象就是一个数据库连接池,它包含"正在用"和"空闲的"连接.一个正在用的连接指的是,你正用它来执行数据库任务,例如执行SQL语句或行查询.当任务完成连接就是空闲的.
当您创建sql.DB执行数据库任务时,它将首先检查连接池中是否有可用的空闲连接.如果有可用的连接,那么Go将重用现有连接,并在执行任务期间将其标记为正在使用.如果池中没有空闲连接,而您需要一个空闲连接,那么Go将创建一个新的连接.
默认情况下,在同一时间打开连接的数量是没有限制(包含使用中+空闲).但你可以通过SetMaxOpenConns()方法实现自定义限制,如下所示:
从理论上讲,允许池中有更多的空闲连接将提高性能,因为这样就不太可能从头开始建立新连接——所以呢有助于提升数据库性能.
当MaxIdleConns设置为none时,必须为每个INSERT从头创建一个新的连接,我们可以从基准测试中看到,平均运行时和内存使用量相对较高.
那么,您应该维护一个大的空闲连接池吗?答案取决于应用程序.重要的是要意识到保持空闲连接是有代价的—它占用了可以用于应用程序和数据库的内存.
当发生这种情况时,sql.DB会优雅地处理它.坏连接将自动重试两次,然后放弃,此时Go将该连接从连接池中删除,并创建一个新的连接.所以呢,将MaxIdleConns设置得太大可能会导致连接变得不可用,与空闲连接池更小(使用更频繁的连接更少)相比,会占有更多的资源.所以,如果你很可能很快就会再次使用,你只需保持一个空闲的连接.
最后要指出的是,MaxIdleConns应该总是小于或等于MaxOpenConns.Go强制执行此操作,并在必要时自动减少MaxIdleConns.
现在让我们看看SetConnMaxLifetime()方法,它设置连接可重用的最大时间长度.如果您的SQL数据库也实现了最大连接生命周期,或者—例如—您希望方便地在负载均衡器后交换数据库,那么这将非常有用.
你可以这样使用它:
在这个例子中,所有的连接都将在创建后1小时"过期",并且在过期后无法重用.但注意:
然后在无限连接的情况下重新运行基准测试......
为了减轻这种情况,你应该始终在一个上下文中传递.在调用数据库时,启用上下文的方法(如ExecContext()),使用固定的、快速的超时上下文对象.
总结
①.、根据经验,应该显式设置MaxOpenConns值.这应该小于数据库和基础设施对连接数量的硬性限制.
对于中小型web应用程序,我通常使用以下设置作为起点,然后根据实际吞吐量水平的负载测试结果进行优化.
安装网址
国内镜像
打开你的终端并执行
macOS 或 Linux
或
如果是zsh
请这样设置
Windows
打开PowerShell 并执行
或者
然后你就可以
①1 Go 安装
Go的三种安装方式
Go有多种安装方式,你可以选择自己喜欢的.这里我们介绍三种最常见的安装方式:
Go源码安装:这是一种标准的软件安装方式.对于经常使用Unix类系统的用户,尤其对于开发者来说,从源码安装可以自己定制.
第三方工具安装:目前有很多方便的第三方软件包工具,例如Ubuntu的apt-get、Mac的homebrew等.这种安装方式适合那些熟悉相应系统的用户.
最后,如果你想在同一个系统中安装多个版本的Go,你可以参考第三方工具GVM,这是目前在这方面做得最好的工具,除非你知道怎么处理.
Go源码安装
在Mac系统中,只要你安装了Xcode,就已经包含了相应的编译工具.
在类Unix系统中,需要安装gcc等工具.例如Ubuntu系统可通过在终端中执行sudo apt-get install gcc
在Windows系统中,你需要安装MinGW,然后通过MinGW安装gcc,并设置相应的环境变量.
cd go/src
./all.bash
运行all.bash后出现"ALL TESTS PASSED"字样时才算安装成功.
上面是Unix风格的命令,Windows下的安装方式类似,只不过是运行all.bat,调用的编译器是MinGW的gcc.
如果是Mac或者Unix用户需要设置几个环境变量,如果想重启之后也能生效的话把下面的命令写到.bashrc或者.zshrc里面,
export GOPATH=$HOME/gopath
export PATH=$PATH:$HOME/go/bin:$GOPATH/bin
如果你是写入文件的,记得执行bash .bashrc或者bash
.zshrc使得设置立马生效.
如果是window系统,就需要设置环境变量,在path里面增加相应的go所在的目录,设置gopath变量.
当你设置完毕之后在命令行里面输入go,看到如下图片即说明你已经安装成功
图1.1 源码安装之后执行Go命令的图
如果出现Go的Usage信息,那么说明Go已经安装成功了;如果出现该命令不存在,那么可以检查一下自己的PATH环境变中是否包含了Go的安装目录.
关于上面的GOPATH将在下面小节详细讲解
Go标准包安装
Go提供了每个平台打好包的一键安装,这些包默认会安装到如下目录:/usr/local/go
(Windows系统:c:\Go),当然你可以改变他们的安装位置,但是改变之后你必须在你的环境变量中设置如下信息:
export GOROOT=$HOME/go
export PATH=$PATH:$GOROOT/bin:$GOPATH/bin
上面这些命令对于Mac和Unix用户来说最好是写入.bashrc或者.zshrc文件,对于windows用户来说当然是写入环境变量.
我们此时此刻呢的Go安装需要判断操作系统的位数,所以这小节我们先确定自己的系统类型.
Linux系统用户可通过在Terminal中执行命令arch(即uname
-m)来查看系统信息:
Mac 安装
看到类似上面源码安装成功的图片说明已经安装成功
如果出现go的Usage信息,那么说明go已经安装成功了;如果出现该命令不存在,那么可以检查一下自己的PATH环境变中是否包含了go的安装目录.
Linux 安装
假定你想要安装Go的目录为 $GO_INSTALL_DIR,后面替换为相应的目录路径.
$GO_INSTALL_DIR.
设置PATH,export PATH=$PATH:$GO_INSTALL_DIR/go/bin
然后执行go
Windows 安装
C:\Go\,若安装到其他位置会导致不能执行自己所编写的 Go 代码.安装完成后默认会在环境变量 Path 后添加 Go 安装目录下的 bin 目录
C:\Go\bin\,并添加环境变量 GOROOT,值为 Go 安装根目录 C:\Go\ .
验证是否安装成功
在运行中输入 cmd 打开命令行工具,在提示符下输入 go,检查是否能看到 Usage 信息.输入
cd %GOROOT%,看是否能进入 Go 安装目录.若都成功,说明安装成功.
不能的话请检查上述环境变量 Path 和 GOROOT 的值.若不存在请卸载后重新安装,存在请重启计算机后重试以上步骤.
第三方工具安装
GVM
gvm是第三方开发的Go多版本管理工具,类似ruby里面的rvm工具.使用起来相当的方便,安装gvm使用如下命令:
bash (curl -s -S -L )
安装完成后我们就可以安装go了:
执行完上面的命令之后GOPATH、GOROOT等环境变量会自动设置好,这样就可以直接使用了.
apt-get
Ubuntu是目前使用最多的Linux桌面系统,使用apt-get命令来管理软件包,我们可以通过下面的命令来安装Go,为了以后方便,应该把
git mercurial 也安装上:
sudo apt-get install python-software-properties
sudo add-apt-repository ppa:gophers/go
sudo apt-get update
sudo apt-get install golang-stable git-core mercurial
homebrew
homebrew是Mac系统下面目前使用最多的管理软件的工具,目前已支持Go,可以通过命令直接安装Go,为了以后方便,应该把
brew update brew upgrade
brew install go
brew install git
brew install mercurial