本文目录一览:

golang命令行库Cobra的使用

写了2次才写完,内容很长,翻译了很久,内容来源于Cobra github介绍。翻译完也更全面的了解了Cobra,功能相当强大完善,各种使用的场景都考虑到了。另外也扩展了一些其它知识,比如 命令行玩法 , Levenshtein distance 等等。以下是正文:

Cobra提供简单的接口来创建强大的现代化CLI接口,比如git与go工具。Cobra同时也是一个程序, 用于创建CLI程序

Cobra是建立在结构的命令、参数和标志之上。

命令代表操作,参数和标志是这些行动的修饰符。

最好的应用程序就像读取句子。用户会知道如何使用本机应用程序,因为他们将理解如何使用它。

比如下面的例子, server 是命令, port 是标志:

在下面的命令,我们告诉Git克隆url地址bare

使用Cobra很简单。首先,使用 go get 安装最新版本

然后在你项目里引用Cobra

通常基于Cobra的应用程序将遵循下面的组织结构,当然你也可以遵循自己的接口:

在Cobra应用程序中,通常main.go文件非常空洞。它主要只干一件事:初始化Cobra。

Cobra提供自己的程序来创建你的程序并且添加你想要的命令。这是最简单的方式把Cobra添加到你的程序里。

这里 你能找到相关信息

使用Cobra,需要创建一个空的main.go文件和一个rootCmd文件。你可以选择在合适的地方添加额外的命令。

Cobra不需要特殊的构造函数。简单的就可以创建你的命令。

理想情况下你把这个放在在 app/cmd/root.go

你会另外定义标志和处理配置init()函数。

比如 cmd/root.go

你需要在main函数里执行root命令。

通常main.go文件非常空洞。它主要只干一件事:初始化Cobra。

其它的命令通常定义在cmd/目录下的自己文件内

如果你想创建一个version命令,你可以创建cmd/version.go文件,并在文件里这么写:

标志提供修饰符控制动作命令如何操作

当标志定义好了,我们需要定义一个变量来关联标志

'持久'表示每个在那个命令下的命令都将能分配到这个标志。对于全局标志,'持久'的标志绑定在root上。

Cobra默认只在目标命令上解析标志,父命令忽略任何局部标志。通过打开 Command.TraverseChildren Cobra将会在执行任意目标命令前解析标志

你同样可以通过 viper 绑定标志:

在这个例子中,永久的标记 author 被 viper 绑定, 注意 , 当用户没有给 --author 提供值, author 不会被赋值。

标记默认是可选的,如果你希望当一个标记没有设置时,命令行报错,你可以标记它为必须的

验证位置参数可以通过 Command 的 Args 字段。

内置下列验证方法

一个设置自定义验证的例子

在下面的例子,我们定义了3个命令。2个在顶级,一个(cmdTimes)是其中一个顶级命令的子命令。在这个例子里,由于没有给 rootCmd 提供 Run ,单独的root是不能运行的,必须要有子命令。

我们仅为一个命令定义了标记。

更多关于flags的文档可以在 找到

更完整大型程序的例子, 可以查看 Hugo .

当你的程序有子命令时,Cobra 会自动给你程序添加help命令。当你运行‘app help’,会调用help命令。另外,help同样支持其它输入命令。例如,你有一个没有任何其它配置的命令叫‘create’,当你调用‘app help create’ Corbra 将会起作用。

下面的输入是 Cobra 自动生成的。除了命令和标志的定义,其它不再需要。

help 就跟其它命令一样,并没有特殊的逻辑或行为。事实上,你也可以提供你自己help如果你想的话。

你能为默认的命令,提供你自己的help命令或模板。使用下面的方法:

后2个也将适用于任何子命令

当用户提供无效的标记或命令,Cobra 将会返回 用法 。

你可能从上面的帮助意识到,默认的帮助将被嵌入到用法里然后作为输出。

你能提供你自己的用法函数或模板给 Cobra 使用。

比如帮助,方法和模板都可以重写。

如果Version字段设置到了根命令,Cobra 会提供了一个顶层 ‘--version’标记。运行带上‘--version’标记的程序,将会按照模板版本信息。模板可以通过 cmd.SetVersionTemplate(s string) 方法修改

在命令运行前或运行后,再运行方法非常容易。 PersistentPreRun 和 PreRun 方法将会在 Run 之前执行。 PersistentPostRun 和 PostRun 方法将会在 Run 之后执行。 Persistent*Run 方法会被子命令继承,如果它们自己没有定义的话。这些方法将按照下面的属性执行:

下面的例子,2个命令都使用了上面的特性。当子命令执行的时候,它将执行根命令的 PersistentPreRun ,但不会执行根命令的 PersistentPostRun :

输出:

Cobra 会自动输出建议,当遇到“unknown command”错误时。这使得当输入错误时, Cobra 的行为类似 git 命令。例如:

建议会基于注册的子命令自动生成。使用了 Levenshtein distance 的实现。每一个注册的命令会匹配2个距离(忽略大小写)来提供建议。

如果你希望在你的命令里,禁用建议或虚弱字符串的距离,使用:

你可以通过 SuggestFor 来给命令提供明确的名词建议。这个特性允许当字符串不相近,但是意思与你的命令相近,别切你也不想给该命令设置别名。比如:

Cobra 可以基于子命令,标记,等生成文档。以以下格式:

Cobra 可以生成一个bash-completion文件。如果你给命令添加更多信息,这些completions可以非常强大和灵活。更多介绍在 Bash Completions 。

socket 通信粘包怎么处理

一、socket 通信粘包的处理方法:

1、对于发送方引起的粘包现象,用户可通过编程设置来避免,TCP提供了强制数据立即传送的操作指令push,TCP软件收到该操作指令后,就立即将本段数据发送出去,而不必等待发送缓冲区满;

2、对于接收方引起的粘包,则可通过优化程序设计、精简接收进程工作量、提高接收进程优先级等措施,使其及时接收数据,从而尽量避免出现粘包现象;

3、由接收方控制,将一包数据按结构字段,人为控制分多次接收,然后合并,通过这种手段来避免粘包。

二、实现代码:

三、方法注意事项:

1、第一种编程设置方法虽然可以避免发送方引起的粘包,但它关闭了优化算法,降低了网络发送效率,影响应用程序的性能,一般不建议使用。

2、第二种方法只能减少出现粘包的可能性,但并不能完全避免粘包,当发送频率较高时,或由于网络突发可能使某个时间段数据包到达接收方较快,接收方还是有可能来不及接收,从而导致粘包;

3、第三种方法虽然避免了粘包,但应用程序的效率较低,对实时应用的场合不适合。

四、实验环境

1、硬件环境:服务器:pentium 350 微机 、客户机:pentium 166微机、网络平台:由10兆共享式hub连接而成的局域网;

2、软件环境:操作系统:windows 98 、编程语言:visual c++ 5.0

知识分享之Golang——精选的组件库、组件列表,各种golang组件都可找到

知识分享之Golang篇是我在日常使用Golang时学习到的各种各样的知识的记录,将其整理出来以文章的形式分享给大家,来进行共同学习。欢迎大家进行持续关注。

知识分享系列目前包含Java、Golang、Linux、Docker等等。

awesome-go 这个组件包含了各种golang中常用的组件,说白了就是一个精选的 Go 框架、库和软件的汇总表。

我们日常需要寻找各种golang组件时在这个列表中基本都可以快速找到。

一起使用GO(golang) 来做一个后台管理系统系列10 使用mod 来管理包

原项目采用gopath来管理的引用库,但有小伙伴反应说包不好下,虽然我把对应的包做了百度云盘共享,但小伙伴们仍然感觉不太好用。特别是最近把go SDK升级到1.18.在管理包上终于下决心使用mod来重新重构下包管理。

一、配置启用Mod

首先那:

确定是否开启了

如果没有开启请开启它。开启命令执行:

#设置 使用七牛云下载

来看下现在的配置:

二、创建项目

上边都说了如何开启了。下面介绍下如何使用

1. 可以随便找一个目录创建项目:myGoProjectNew

这个时候查看目录下会多出一个go.mod的文件:

里面也有了。标识了下SDK的版本1.18

2. 创建 main.go文件

3. 执行:

这时候就会自动下载引用了。

查看Go.mod文件

最后放两张效果图:

感觉还可以得点赞收藏哦。想要源码的私信我获取源码。

golang udp编程

用户数据报协议(User Datagram Protocol,缩写为UDP),又称用户数据报文协议,是一个简单的面向数据报(package-oriented)的传输层协议,正式规范为RFC 768。

UDP只提供数据的不可靠传递,它一旦把应用程序发给网络层的数据发送出去,就不保留数据备份(所以UDP有时候也被认为是不可靠的数据报协议)。

UDP在IP数据报的头部仅仅加入了复用和数据校验。

由于缺乏可靠性且属于非连接导向协议,UDP应用一般必须允许一定量的丢包、出错和复制粘贴。

1 在接收udp包时,如果接收包时给定的buffer太小的话,就要自己解决粘包问题。

2 udp包的发送和接收不保证一定成功,不保证按正确顺序抵达。

3 如果不允许丢包的情况出现的话,要有重发机制来保证,如:反馈机制确认。

服务端

客户端

Golang常用包有哪些

⑴ Go Kit

它本身不是一个框架,而是一套微服务工具集,可以用于解决分布式系统开发中的大多数常见问题,所以使用者可以专注于你的业务逻辑中。

⑵ Gingko

是一个Go测试框架,目的是帮助我们使用行为驱动开发风格高效地编写富有表现力和全面的测试,它有着非常良好的帮助文档,任何人都可以轻松地在项目中集成使用它。

⑶ NSQ

实时分布式消息传递平台,提供高可用性和可靠的消息传递保证,可以水平扩展,支持负载均衡,安装部署非常方便。

⑷ Goose

Golang中最佳的数据库迁移包,通过创建增量SQL更改和Go函数来管理数据库结构,在Go1.16版本以上,还支持了嵌入式sql迁移。

⑸ GORM

是一个功能齐全的Golang对象关系映射库,是一种开发人员友好的工具,用于在不兼容的类型系统之间转换数据,专门设计用于在类型系统之间切换时最大限度地减少重写代码。

⑹ Authboss

一个模块化的身份验证包,使用它你可以快速地在项目中进行身份验证管理。它有几个常见的身份验证和授权模块供开发人员选择。

⑺ cli

是一个简单快捷的命令行管理包,用于为Go语言构建命令行应用程序,允许开发人员开发自己的富有表现力的命令行应用程序,用于创建标志、bash完成例程并生成帮助文本。

⑻ Vegeta

是一个用于HTTP负载测试的工具包,这个多功能工具专为测试具有恒定请求率的HTTP服务而设计。它可以有效地分析程序中的潜在问题,是一个始终贯穿以提高整体性能为目的的包。