Cobra既是用于创建强大的现代CLI应用程序的库,也是用于生成应用程序和命令文件的程序。
许多最广泛使用的Go项目都是使用Cobra构建的,包括:
~~~
Kubernetes
Hugo
rkt
etcd
Moby (former Docker)
Docker (distribution)
OpenShift
Delve
GopherJS
CockroachDB
Bleve
ProjectAtomic (enterprise)
GiantSwarm's swarm
Nanobox/Nanopack
rclone
nehm
Pouch
~~~
## 概述
Cobra是一个库,提供了一个简单的[界面](https://www.baidu.com/s?wd=%E7%95%8C%E9%9D%A2&tn=24004469_oem_dg&rsv_dl=gh_pl_sl_csd)来创建类似于git&go工具的强大的现代CLI界面。
Cobra也是一个应用程序,它将生成您的应用程序支架,以快速开发基于Cobra的应用程序。
Cobra提供:
~~~
简单易用的基于CLI:app server,app fetch等。
完全符合POSIX标准(包括including short & long versions)
嵌套的子命令
全局,本地和级联标志
易产生的应用程序和命令与cobra init appname&cobra add cmdname
智能建议
命令和标志的自动帮助生成
自动帮助标志识别-h,--help等等。
为您的应用程序自动生成bash自动完成
为您的应用程序自动生成的手册页
命令别名,以便您可以在不破坏它们的情况下进行更改
灵活定义您自己的帮助,用法等。
可选择与viper紧密集成,适用于12-factor应用
~~~
# 概念
Cobra建立在命令,参数和标志的结构上。
**Commands**代表动作,**Args**代表参数,**Flags**是这些动作的修饰符。
最好的应用程序在使用时会像句子一样读取。用户将知道如何使用该应用程序,因为他们将原生地了解如何使用它。
要遵循的模式是 `APPNAME VERB NOUN --ADJECTIVE.` 或 `APPNAME COMMAND ARG --FLAG`
使用以下示例进行说明,在以下示例中,'server'是一个命令,'port'是一个标志:
~~~
hugo server --port=1313
~~~
在这个命令中,我们告诉Git克隆url
~~~
git clone URL --bare
~~~
## Commands命令
命令是应用程序的中心点。应用程序支持的每个交互都将包含在命令中。命令可以具有子命令并可选地运行动作。
在上面的示例中,'server'是命令。[更多关于cobra.Command](https://godoc.org/github.com/spf13/cobra#Command)
## Flags标志
标志是一种修改命令行为的方法。Cobra支持完全符合POSIX标准的标志以及Go [标志包](https://golang.org/pkg/flag/)。Cobra命令可以定义持久保存到子命令和标志的标志,这些命令和标志仅对该命令可用。
在上面的例子中,'port'是标志。
[标志功能](https://www.baidu.com/s?wd=%E6%A0%87%E5%BF%97%E5%8A%9F%E8%83%BD&tn=24004469_oem_dg&rsv_dl=gh_pl_sl_csd)由[pflag库](https://github.com/spf13/pflag)提供,[pflag库](https://github.com/spf13/pflag)是标准库的一个分支,它在添加POSIX兼容性时保持相同的接口。
# Installing安装
使用cobra很容易。首先,使用`go get`安装最新版本的库。此命令将安装`cobra`生成器可执行文件以及库及其依赖项:
~~~
go get -u github.com/spf13/cobra/cobra
~~~
接下来,在您的应用程序中包含Cobra:
~~~
import "github.com/spf13/cobra"
~~~
# Getting Started入门
虽然欢迎您提供自己的组织,但通常基于Cobra的应用程序将遵循以下组织结构:
~~~
▾ appName/
▾ cmd/
add.go
your.go
commands.go
here.go
main.go
~~~
在Cobra应用程序中,通常main.go是暴露的文件。它有一个目的:初始化Cobra
~~~
package main
import (
"{pathToYourApp}/cmd"
)
func main() {
cmd.Execute()
}
~~~
## 使用Cobra生成器
Cobra提供了自己的程序,可以创建您的应用程序并添加您想要的任何命令。这是将Cobra整合到您的应用程序中的最简单方法。
[在这里](https://github.com/spf13/cobra/blob/master/cobra/README.md)您可以找到有关它的更多信息。
## 使用Cobra Library
要手动实现Cobra,您需要创建一个暴露的main.go文件和一个rootCmd文件。您可以选择根据需要提供其他命令。
### 创建rootCmd
cobra不需要任何特殊的构造函数。只需创建命令即可。
理想情况下,您将其放在app / cmd / root.go中:
~~~
var rootCmd = &cobra.Command{
Use: "hugo",
Short: "Hugo is a very fast static site generator",
Long: `A Fast and Flexible Static Site Generator built with
love by spf13 and friends in Go.
Complete documentation is available at http://hugo.spf13.com`,
Run: func(cmd *cobra.Command, args []string) {
// Do Stuff Here
},
}
func Execute() {
if err := rootCmd.Execute(); err != nil {
fmt.Println(err)
os.Exit(1)
}
}
~~~
您还将在init()函数中定义标志和句柄配置。
例如cmd / root.go:
~~~
import (
"fmt"
"os"
homedir "github.com/mitchellh/go-homedir"
"github.com/spf13/cobra"
"github.com/spf13/viper"
)
func init() {
cobra.OnInitialize(initConfig)
rootCmd.PersistentFlags().StringVar(&cfgFile, "config", "", "config file (default is $HOME/.cobra.yaml)")
rootCmd.PersistentFlags().StringVarP(&projectBase, "projectbase", "b", "", "base project directory eg. github.com/spf13/")
rootCmd.PersistentFlags().StringP("author", "a", "YOUR NAME", "Author name for copyright attribution")
rootCmd.PersistentFlags().StringVarP(&userLicense, "license", "l", "", "Name of license for the project (can provide `licensetext` in config)")
rootCmd.PersistentFlags().Bool("viper", true, "Use Viper for configuration")
viper.BindPFlag("author", rootCmd.PersistentFlags().Lookup("author"))
viper.BindPFlag("projectbase", rootCmd.PersistentFlags().Lookup("projectbase"))
viper.BindPFlag("useViper", rootCmd.PersistentFlags().Lookup("viper"))
viper.SetDefault("author", "NAME HERE <EMAIL ADDRESS>")
viper.SetDefault("license", "apache")
}
func initConfig() {
// Don't forget to read config either from cfgFile or from home directory!
if cfgFile != "" {
// Use config file from the flag.
viper.SetConfigFile(cfgFile)
} else {
// Find home directory.
home, err := homedir.Dir()
if err != nil {
fmt.Println(err)
os.Exit(1)
}
// Search config in home directory with name ".cobra" (without extension).
viper.AddConfigPath(home)
viper.SetConfigName(".cobra")
}
if err := viper.ReadInConfig(); err != nil {
fmt.Println("Can't read config:", err)
os.Exit(1)
}
}
~~~
### 创建你的main.go
使用root命令,您需要让main函数执行它。为了清楚起见,应该在root上运行Execute,尽管可以在任何命令上调用它。
在Cobra应用程序中,通常在main.go暴露。它有一个目的,就是初始化Cobra。
~~~
package main
import (
"fmt"
"os"
"{pathToYourApp}/cmd"
)
func main() {
cmd.Execute()
}
~~~
### 创建其他命令
可以定义其他命令,并且通常在cmd /目录中为每个命令提供自己的文件。
如果要创建版本命令,可以创建cmd / version.go并使用以下内容填充它:
~~~
package cmd
import (
"fmt"
"github.com/spf13/cobra"
)
func init() {
rootCmd.AddCommand(versionCmd)
}
var versionCmd = &cobra.Command{
Use: "version",
Short: "Print the version number of Hugo",
Long: `All software has versions. This is Hugo's`,
Run: func(cmd *cobra.Command, args []string) {
fmt.Println("Hugo Static Site Generator v0.9 -- HEAD")
},
}
~~~
### 使用Flags
Flags提供修饰符来控制动作命令的操作方式。
### 为命令分配Flags
由于flag是在不同的位置定义和使用的,因此我们需要在外部定义一个具有正确范围的变量来分配要使用的标志。
~~~
var Verbose bool
var Source string
~~~
分配标志有两种不同的方法。
### 持久的Flags
Flags可以是“持久的”,这意味着该标志可用于它所分配的命令以及该命令下的每个命令。对于全局标志,在根上分配Flag作为持久Flag。
~~~
rootCmd.PersistentFlags().BoolVarP(&Verbose, "verbose", "v", false, "verbose output")
~~~
### 本地Flags
还可以在本地分配一个Flag,该Flag仅适用于该特定命令。
~~~
rootCmd.Flags().StringVarP(&Source, "source", "s", "", "Source directory to read from")
~~~
### 父命令上的本地Flags
默认情况下,Cobra仅解析目标命令上的本地Flag,忽略父命令上的任何本地Flag。通过启用`Command.TraverseChildren`Cobra将在执行目标命令之前解析每个命令上的本地Flag。
~~~
command := cobra.Command{ Use: "print [OPTIONS] [COMMANDS]", TraverseChildren: true,}
~~~
### 使用配置绑定Flags
你也可以用[viper](https://blog.csdn.net/cs380637384/article/details/81217767)绑定你的Flags
~~~
var author string
func init() {
rootCmd.PersistentFlags().StringVar(&author, "author", "YOUR NAME", "Author name for copyright attribution")
viper.BindPFlag("author", rootCmd.PersistentFlags().Lookup("author"))
}
~~~
在此示例中,持久Flags `author`与之绑定`viper`。 **请注意**,`author`当`--author`用户未提供该标志时,该变量将不会设置为config中的值。
更多[viper文档](https://blog.csdn.net/cs380637384/article/details/81217767)。
### 必需的Flags
Flags默认是可选的。如果您希望命令在未设置Flags时报告错误,请将其标记为必需:
~~~
rootCmd.Flags().StringVarP(&Region, "region", "r", "", "AWS region (required)")
rootCmd.MarkFlagRequired("region")
~~~
### 位置和自定义参数
可以使用`Args`字段来指定位置参数的验证`Command`。
以下验证器内置:
* `NoArgs` - 如果存在任何位置参数,该命令将报告错误。
* `ArbitraryArgs` - 该命令将接受任何args。
* `OnlyValidArgs`\- 如果存在任何不在`ValidArgs`字段中的位置参数,该命令将报告错误`Command`。
* `MinimumNArgs(int)` - 如果没有至少N个位置参数,该命令将报告错误。
* `MaximumNArgs(int)` - 如果有多于N个位置参数,该命令将报告错误。
* `ExactArgs(int)` - 如果没有确切的N位置参数,该命令将报告错误。
* `RangeArgs(min, max)` - 如果args的数量不在预期args的最小和最大数量之间,则该命令将报告错误。
设置自定义验证器的示例:
~~~
var cmd = &cobra.Command{
Short: "hello",
Args: func(cmd *cobra.Command, args []string) error {
if len(args) < 1 {
return errors.New("requires at least one arg")
}
if myapp.IsValidColor(args[0]) {
return nil
}
return fmt.Errorf("invalid color specified: %s", args[0])
},
Run: func(cmd *cobra.Command, args []string) {
fmt.Println("Hello, World!")
},
}
~~~
### 示例:
在下面的示例中,我们定义了三个命令。两个位于顶层,一个(cmdTimes)是顶级命令之一的子级。在这种情况下,root不可执行,这意味着需要子命令。这是通过不为'rootCmd'提供'Run'来实现的。
我们只为一个命令定义了一个标志。
有关标志的更多文档,请访问[https://github.com/spf13/pflag](https://github.com/spf13/pflag)
~~~
package main
import (
"fmt"
"strings"
"github.com/spf13/cobra"
)
func main() {
var echoTimes int
var cmdPrint = &cobra.Command{
Use: "print [string to print]",
Short: "Print anything to the screen",
Long: `print is for printing anything back to the screen.
For many years people have printed back to the screen.`,
Args: cobra.MinimumNArgs(1),
Run: func(cmd *cobra.Command, args []string) {
fmt.Println("Print: " + strings.Join(args, " "))
},
}
var cmdEcho = &cobra.Command{
Use: "echo [string to echo]",
Short: "Echo anything to the screen",
Long: `echo is for echoing anything back.
Echo works a lot like print, except it has a child command.`,
Args: cobra.MinimumNArgs(1),
Run: func(cmd *cobra.Command, args []string) {
fmt.Println("Print: " + strings.Join(args, " "))
},
}
var cmdTimes = &cobra.Command{
Use: "times [# times] [string to echo]",
Short: "Echo anything to the screen more times",
Long: `echo things multiple times back to the user by providing
a count and a string.`,
Args: cobra.MinimumNArgs(1),
Run: func(cmd *cobra.Command, args []string) {
for i := 0; i < echoTimes; i++ {
fmt.Println("Echo: " + strings.Join(args, " "))
}
},
}
cmdTimes.Flags().IntVarP(&echoTimes, "times", "t", 1, "times to echo the input")
var rootCmd = &cobra.Command{Use: "app"}
rootCmd.AddCommand(cmdPrint, cmdEcho)
cmdEcho.AddCommand(cmdTimes)
rootCmd.Execute()
}
~~~
有关更大应用程序的更完整示例,请查看[Hugo](http://gohugo.io/)
## 帮助命令
当您有子命令时,Cobra会自动为您的应用程序添加一个帮助命令。当用户运行“app help”时会调用此方法。此外,帮助还将支持所有其他命令作为输入。比如说,你有一个名为'create'的命令,没有任何额外的配置; 当'app help create'被调用时,Cobra会工作。每个命令都会自动添加' - help'标志。
### 例
以下输出由Cobra自动生成。除了命令和标志定义之外,不需要任何其他内容。
~~~
$ cobra help
Cobra is a CLI library for Go that empowers applications.
This application is a tool to generate the needed files
to quickly create a Cobra application.
Usage:
cobra [command]
Available Commands:
add Add a command to a Cobra Application
help Help about any command
init Initialize a Cobra Application
Flags:
-a, --author string author name for copyright attribution (default "YOUR NAME")
--config string config file (default is $HOME/.cobra.yaml)
-h, --help help for cobra
-l, --license string name of license for the project
--viper use Viper for configuration (default true)
Use "cobra [command] --help" for more information about a command.
~~~
帮助就像任何其他命令一样。它周围没有特殊的逻辑或行为。事实上,如果你愿意,你可以提供自己的。
### 定义自己的help
您可以提供自己的help命令或自己的模板,以使用以下函数使用的默认命令:
~~~
cmd.SetHelpCommand(cmd *Command)
cmd.SetHelpFunc(f func(*Command, []string))
cmd.SetHelpTemplate(s string)
~~~
后两者也适用于任何子命令。
## 用法
当用户提供无效标志或无效命令时,Cobra会通过向用户显示“使用情况”来做出响应。
### 示例
您可以从上面的帮助中认识到这一点。那是因为默认帮助将用法嵌入其输出中。
~~~
$ cobra --invalid
Error: unknown flag: --invalid
Usage:
cobra [command]
Available Commands:
add Add a command to a Cobra Application
help Help about any command
init Initialize a Cobra Application
Flags:
-a, --author string author name for copyright attribution (default "YOUR NAME")
--config string config file (default is $HOME/.cobra.yaml)
-h, --help help for cobra
-l, --license string name of license for the project
--viper use Viper for configuration (default true)
Use "cobra [command] --help" for more information about a command.
~~~
### 定义自己的用法
您可以提供自己的使用功能或模板供Cobra使用。与help一样,函数和模板可以通过公共方法覆盖:
~~~
cmd.SetUsageFunc(f func(*Command) error)
cmd.SetUsageTemplate(s string)
~~~
## 版本flags
如果在root命令上设置了Version字段,Cobra会添加顶级'--version'标志。使用'--version'标志运行应用程序将使用版本模板将版本打印到stdout。可以使用该`cmd.SetVersionTemplate(s string)`功能自定义模板 。
## PreRun和PostRun Hooks
`Run`命令在主函数之前或之后运行函数。`PersistentPreRun`和`PreRun`功能执行之前`Run`。`PersistentPostRun`和`PostRun`将在后执行`Run`。`Persistent*Run`如果子程序没有声明他们自己的功能,他们将继承这些功能。这些功能按以下顺序运行:
~~~
PersistentPreRun
PreRun
Run
PostRun
PersistentPostRun
~~~
下面是使用所有这些功能的两个命令的示例。执行子命令时,它将运行root命令,`PersistentPreRun`但不运行root命令`PersistentPostRun`:
~~~
package main
import (
"fmt"
"github.com/spf13/cobra"
)
func main() {
var rootCmd = &cobra.Command{
Use: "root [sub]",
Short: "My root command",
PersistentPreRun: func(cmd *cobra.Command, args []string) {
fmt.Printf("Inside rootCmd PersistentPreRun with args: %v\n", args)
},
PreRun: func(cmd *cobra.Command, args []string) {
fmt.Printf("Inside rootCmd PreRun with args: %v\n", args)
},
Run: func(cmd *cobra.Command, args []string) {
fmt.Printf("Inside rootCmd Run with args: %v\n", args)
},
PostRun: func(cmd *cobra.Command, args []string) {
fmt.Printf("Inside rootCmd PostRun with args: %v\n", args)
},
PersistentPostRun: func(cmd *cobra.Command, args []string) {
fmt.Printf("Inside rootCmd PersistentPostRun with args: %v\n", args)
},
}
var subCmd = &cobra.Command{
Use: "sub [no options!]",
Short: "My subcommand",
PreRun: func(cmd *cobra.Command, args []string) {
fmt.Printf("Inside subCmd PreRun with args: %v\n", args)
},
Run: func(cmd *cobra.Command, args []string) {
fmt.Printf("Inside subCmd Run with args: %v\n", args)
},
PostRun: func(cmd *cobra.Command, args []string) {
fmt.Printf("Inside subCmd PostRun with args: %v\n", args)
},
PersistentPostRun: func(cmd *cobra.Command, args []string) {
fmt.Printf("Inside subCmd PersistentPostRun with args: %v\n", args)
},
}
rootCmd.AddCommand(subCmd)
rootCmd.SetArgs([]string{""})
rootCmd.Execute()
fmt.Println()
rootCmd.SetArgs([]string{"sub", "arg1", "arg2"})
rootCmd.Execute()
}
~~~
打印
~~~
Inside rootCmd PersistentPreRun with args: []
Inside rootCmd PreRun with args: []
Inside rootCmd Run with args: []
Inside rootCmd PostRun with args: []
Inside rootCmd PersistentPostRun with args: []
Inside rootCmd PersistentPreRun with args: [arg1 arg2]
Inside subCmd PreRun with args: [arg1 arg2]
Inside subCmd Run with args: [arg1 arg2]
Inside subCmd PostRun with args: [arg1 arg2]
Inside subCmd PersistentPostRun with args: [arg1 arg2]
~~~
### “未知命令”发生时的建议
当“未知命令”错误发生时,Cobra将打印自动建议。这使得Cobra `git`在发生拼写错误时的行为与命令类似。例如:
~~~
$ hugo srever
Error: unknown command "srever" for "hugo"
Did you mean this?
server
Run 'hugo --help' for usage.
~~~
根据注册的每个子命令自动提出建议,并使用[Levenshtein距离](http://en.wikipedia.org/wiki/Levenshtein_distance)的实现。每个匹配最小距离为2(忽略大小写)的注册命令将显示为建议。
如果您需要在命令中禁用建议或调整字符串距离,请使用:
~~~
command.DisableSuggestions = true
#或者
command.SuggestionsMinimumDistance = 1
~~~
您还可以使用该`SuggestFor`属性显式设置要为其指定命令的名称。这允许建议字符串距离不接近的字符串,但在您的命令集和一些您不想要别名的字符串中有意义。例如:
~~~
$ kubectl remove
Error: unknown command "remove" for "kubectl"
Did you mean this?
delete
Run 'kubectl help' for usage.
~~~
- 序言
- 目录
- 环境搭建
- Linux搭建golang环境
- Windows搭建golang环境
- Mac搭建golang环境
- Go 环境变量
- 编辑器
- vs code
- Mac 安装vs code
- Windows 安装vs code
- vim编辑器
- 介绍
- 1.Go语言的主要特征
- 2.golang内置类型和函数
- 3.init函数和main函数
- 4.包
- 1.工作空间
- 2.源文件
- 3.包结构
- 4.文档
- 5.编写 Hello World
- 6.Go语言 “ _ ”(下划线)
- 7.运算符
- 8.命令
- 类型
- 1.变量
- 2.常量
- 3.基本类型
- 1.基本类型介绍
- 2.字符串String
- 3.数组Array
- 4.类型转换
- 4.引用类型
- 1.引用类型介绍
- 2.切片Slice
- 3.容器Map
- 4.管道Channel
- 5.指针
- 6.自定义类型Struct
- 流程控制
- 1.条件语句(if)
- 2.条件语句 (switch)
- 3.条件语句 (select)
- 4.循环语句 (for)
- 5.循环语句 (range)
- 6.循环控制Goto、Break、Continue
- 函数
- 1.函数定义
- 2.参数
- 3.返回值
- 4.匿名函数
- 5.闭包、递归
- 6.延迟调用 (defer)
- 7.异常处理
- 8.单元测试
- 压力测试
- 方法
- 1.方法定义
- 2.匿名字段
- 3.方法集
- 4.表达式
- 5.自定义error
- 接口
- 1.接口定义
- 2.执行机制
- 3.接口转换
- 4.接口技巧
- 面向对象特性
- 并发
- 1.并发介绍
- 2.Goroutine
- 3.Chan
- 4.WaitGroup
- 5.Context
- 应用
- 反射reflection
- 1.获取基本类型
- 2.获取结构体
- 3.Elem反射操作基本类型
- 4.反射调用结构体方法
- 5.Elem反射操作结构体
- 6.Elem反射获取tag
- 7.应用
- json协议
- 1.结构体转json
- 2.map转json
- 3.int转json
- 4.slice转json
- 5.json反序列化为结构体
- 6.json反序列化为map
- 终端读取
- 1.键盘(控制台)输入fmt
- 2.命令行参数os.Args
- 3.命令行参数flag
- 文件操作
- 1.文件创建
- 2.文件写入
- 3.文件读取
- 4.文件删除
- 5.压缩文件读写
- 6.判断文件或文件夹是否存在
- 7.从一个文件拷贝到另一个文件
- 8.写入内容到Excel
- 9.日志(log)文件
- server服务
- 1.服务端
- 2.客户端
- 3.tcp获取网页数据
- 4.http初识-浏览器访问服务器
- 5.客户端访问服务器
- 6.访问延迟处理
- 7.form表单提交
- web模板
- 1.渲染终端
- 2.渲染浏览器
- 3.渲染存储文件
- 4.自定义io.Writer渲染
- 5.模板语法
- 时间处理
- 1.格式化
- 2.运行时间
- 3.定时器
- 锁机制
- 互斥锁
- 读写锁
- 性能比较
- sync.Map
- 原子操作
- 1.原子增(减)值
- 2.比较并交换
- 3.导入、导出、交换
- 加密解密
- 1.md5
- 2.base64
- 3.sha
- 4.hmac
- 常用算法
- 1.冒泡排序
- 2.选择排序
- 3.快速排序
- 4.插入排序
- 5.睡眠排序
- 限流器
- 日志包
- 日志框架logrus
- 随机数验证码
- 生成指定位数的随机数
- 生成图形验证码
- 编码格式转换
- UTF-8与GBK
- 解决中文乱码
- 设计模式
- 创建型模式
- 单例模式
- singleton.go
- singleton_test.go
- 抽象工厂模式
- abstractfactory.go
- abstractfactory_test.go
- 工厂方法模式
- factorymethod.go
- factorymethod_test.go
- 原型模式
- prototype.go
- prototype_test.go
- 生成器模式
- builder.go
- builder_test.go
- 结构型模式
- 适配器模式
- adapter.go
- adapter_test.go
- 桥接模式
- bridge.go
- bridge_test.go
- 合成/组合模式
- composite.go
- composite_test.go
- 装饰模式
- decoretor.go
- decorator_test.go
- 外观模式
- facade.go
- facade_test.go
- 享元模式
- flyweight.go
- flyweight_test.go
- 代理模式
- proxy.go
- proxy_test.go
- 行为型模式
- 职责链模式
- chainofresponsibility.go
- chainofresponsibility_test.go
- 命令模式
- command.go
- command_test.go
- 解释器模式
- interpreter.go
- interperter_test.go
- 迭代器模式
- iterator.go
- iterator_test.go
- 中介者模式
- mediator.go
- mediator_test.go
- 备忘录模式
- memento.go
- memento_test.go
- 观察者模式
- observer.go
- observer_test.go
- 状态模式
- state.go
- state_test.go
- 策略模式
- strategy.go
- strategy_test.go
- 模板模式
- templatemethod.go
- templatemethod_test.go
- 访问者模式
- visitor.go
- visitor_test.go
- 数据库操作
- golang操作MySQL
- 1.mysql使用
- 2.insert操作
- 3.select 操作
- 4.update 操作
- 5.delete 操作
- 6.MySQL事务
- golang操作Redis
- 1.redis介绍
- 2.golang链接redis
- 3.String类型 Set、Get操作
- 4.String 批量操作
- 5.设置过期时间
- 6.list队列操作
- 7.Hash表
- 8.Redis连接池
- 其它Redis包
- go-redis/redis包
- 安装介绍
- String 操作
- List操作
- Set操作
- Hash操作
- golang操作ETCD
- 1.etcd介绍
- 2.链接etcd
- 3.etcd存取
- 4.etcd监听Watch
- golang操作kafka
- 1.kafka介绍
- 2.写入kafka
- 3.kafka消费
- golang操作ElasticSearch
- 1.ElasticSearch介绍
- 2.kibana介绍
- 3.写入ElasticSearch
- NSQ
- 安装
- 生产者
- 消费者
- zookeeper
- 基本操作测试
- 简单的分布式server
- Zookeeper命令行使用
- GORM
- gorm介绍
- gorm查询
- gorm更新
- gorm删除
- gorm错误处理
- gorm事务
- sql构建
- gorm 用法介绍
- Go操作memcached
- beego框架
- 1.beego框架环境搭建
- 2.参数配置
- 1.默认参数
- 2.自定义配置
- 3.config包使用
- 3.路由设置
- 1.自动匹配
- 2.固定路由
- 3.正则路由
- 4.注解路由
- 5.namespace
- 4.多种数据格式输出
- 1.直接输出字符串
- 2.模板数据输出
- 3.json格式数据输出
- 4.xml格式数据输出
- 5.jsonp调用
- 5.模板处理
- 1.模板语法
- 2.基本函数
- 3.模板函数
- 6.请求处理
- 1.GET请求
- 2.POST请求
- 3.文件上传
- 7.表单验证
- 1.表单验证
- 2.定制错误信息
- 3.struct tag 验证
- 4.XSRF过滤
- 8.静态文件处理
- 1.layout设计
- 9.日志处理
- 1.日志处理
- 2.logs 模块
- 10.会话控制
- 1.会话控制
- 2.session 包使用
- 11.ORM 使用
- 1.链接数据库
- 2. CRUD 操作
- 3.原生 SQL 操作
- 4.构造查询
- 5.事务处理
- 6.自动建表
- 12.beego 验证码
- 1.验证码插件
- 2.验证码使用
- beego admin
- 1.admin安装
- 2.admin开发
- beego 热升级
- beego实现https
- gin框架
- 安装使用
- 路由设置
- 模板处理
- 文件上传
- gin框架中文文档
- gin错误总结
- 项目
- 秒杀项目
- 日志收集
- 面试题
- 面试题一
- 面试题二
- 错题集
- Go语言陷阱和常见错误
- 常见语法错误
- 初级
- 中级
- 高级
- Go高级应用
- goim
- goim 启动流程
- goim 工作流程
- goim 结构体
- gopush
- gopush工作流程
- gopush启动流程
- gopush业务流程
- gopush应用
- gopush新添功能
- gopush压力测试
- 压测注意事项
- rpc
- HTTP RPC
- TCP RPC
- JSON RPC
- 常见RPC开源框架
- pprof
- pprof介绍
- pprof应用
- 使用pprof及Go 程序的性能优化
- 封装 websocket
- cgo
- Golang GC
- 查看程序运行过程中的GC信息
- 定位gc问题所在
- Go语言 demo
- 用Go语言计算一个人的年龄,生肖,星座
- 超简易Go语言实现的留言板代码
- 信号处理模块,可用于在线加载配置,配置动态加载的信号为SIGHUP
- 阳历和阴历相互转化的工具类 golang版本
- 错误总结
- 网络编程
- 网络编程http
- 网络编程tcp
- Http请求
- Go语言必知的90个知识点
- 第三方库应用
- cli应用
- Cobra
- 图表库
- go-echarts
- 开源IM
- im_service
- 机器学习库
- Tensorflow
- 生成二维码
- skip2/go-qrcode生成二维码
- boombuler/barcode生成二维码
- tuotoo/qrcode识别二维码
- 日志库
- 定时任务
- robfig/cron
- jasonlvhit/gocron
- 拼多多开放平台 SDK
- Go编译
- 跨平台交叉编译
- 一问一答
- 一问一答(一)
- 为什么 Go 标准库中有些函数只有签名,没有函数体?
- Go开发的应用
- etcd
- k8s
- Caddy
- nsq
- Docker
- web框架