如何从零开始做网站/百度seo公司哪家强一点

如何从零开始做网站,百度seo公司哪家强一点,网站源代码查看,付费推广的途径和原因CLI开发框架 命令行工具开发,主要是介绍开发用到的包,集成了一个框架,只要学会了基本每个人都能开发安全工具了。 该文章先学flags包,是比较经典的一个包,相比后面要学习的集成框架这个比较自由比较细化点&#xff0…

CLI开发框架

命令行工具开发,主要是介绍开发用到的包,集成了一个框架,只要学会了基本每个人都能开发安全工具了。

该文章先学flags包,是比较经典的一个包,相比后面要学习的集成框架这个比较自由比较细化点,自定义可能高一些,后续会学到一个Cobra框架,这个很多安全工具都在使用,先学会flags包入门再去理解Cobra框架就比较好学。

flags包

  • 支持段选项长选项
    意思是使用的时候可以用简写也可以用完整的参数写,比如一个工具叫a.exe,用的时候可以a.exe -h 也可以 a.exe -help
  • 支持短选项组合写,比如:a.exe -p a.exe -s 两种可以写在一起:a.exe -ps
  • 一个参数选项可以给多个值(代码中很容易了解到这一点)
  • flags包默认有-h选项,解析完后–help和-h会返回你的所有参数解释,不用自己写help

安装

go get github.com/jessevdk/go-flags

个人感觉学习这个框架只需要理解两步:

  • 指定结构体选项
  • 解析结构体

基础的选项:随便写几个展示即可

  • short:短选项名字
  • long:长选项名字
  • description:显示你当前选项的一个解释,-help或者-h的时候显示
  • tips:
// 参数选项type Option struct {//所有结构体首字母一定要大写,否则解析不了,但是short或者long的名字就随便你起V     string   `short:"v" long:"verbose" description:"显示详细信息"`Vlist []string `short:"V" long:"verbose-list" description:"显示详细信息列表"`I     int      `short:"i" long:"input" description:"int类型测试"`//这里可以给了一个默认值default:"xxx",不给的话在不使用该参数的时候就不用调用那个函数P      func(string)   `short:"p" long:"print" description:"打印"` // default:"myPrint"IntMap map[string]int `short:"m" long:"intmap" description:"intmap"`}

函数这里是要给一个函数传递进去使用,具体如下:
是在你实例化你的选项结构体后,将你写好的函数传递进去,或者你写一个匿名函数也行。

// 打印功能func myPrint(str string) {fmt.Println("打印-p参数值:", str)}
func main() {var opt Option  //定义一个选项opt.P = myPrint //把打印函数赋值给P
}

使用的时候就可以用该参数了,传递的参数值就是给到函数变量使用的:

参数传递格式

  • -V传递:-V 123 -V 456 -V 789
    这样才能传递进map里面,不可以使用逗号或者空格隔开-V 123 456 / -V 123,456都是不行的
  • map的传递:-m key1:123 -m key2:456,不建议使用等号=,至少我在windows测试的时候等号不能作为键值对分割,只能使用:分割,同时多个map键值对也是多个-m才能传递添加进去。

剩下几个类型自己实践即可,这里就够用了。


选项设置

选项设置都是直接在结构体选项反引号中直接添加即可,他会解析的。

  • required:在结构体选项中可设置,true的时候,该选项必选,否则报错,一定要给这个选项一个值
    比如:
    V  string   short:"v" long:"verbose" description:"显示详细信息" required:true

  • default:表示你这个选项参数有一个默认值,就算你不加他也会以默认值形式作用本次运行
    比如:上面结构体代码注释其实有提到
    P  func(string)   short:"p" long:"print" description:"打印" default:"myPrint"
    这里就是可以给一个default,表示这个选项的默认值是多少,可以看到我这里给的是一个函数名,这个函数名我也在代码这种实现了吗,所以运行的时候肯定是可以找到我这个函数然后执行

分组

这个功能比较好用,至少对我来说以后开发构思中肯定需要用到这个,以及后面讲的子命令都是在一些比较完整的工具开发中用的比较多。

先看运行的效果图

这里和之前的不一样了,之前的没有分组的时候就是直接把一些参数打印出来,这里会有参数分组,对比之下会更加直观一点。

分组的结构体之间的联系是比较紧密的

  • 先创建好组名(组名也要用结构体)
    结构体内的字段都是你接下来要创建的结构体选项,所以在这里可以先提前想好选项的结构体名字
    比如下面的就是HostScan就是我们接下来要创建的分组的选项参数结构体
    group就是组名,到时候你在help中就能看到分组的组名
    namespace是空间名,在help中显示为Host.xxx选项,就是类似这样,主要是告诉你哪个组下的选项,重要是group是组名即可,显示的时候比较明显。
// basic 分组type Basic struct {HostOption Host `group:"host" namespace:"Host"`ScanOption Scan `group:"scan" namespace:"Scan"`}
  • 正常创建你在分组的时候想好的那几个结构体字段,我们给的名字是:HostScanOption,那么接下来就是写这两个结构体了
    注意:我在Scan中又开了一个组ScanType,所以还要写一个ScanType的结构体
    这是help效果图,应该很容易理解是怎么分组的了,也知道那个namespace是什么了,注意区分Hosthost,host是分组的组名,Host才是那个namespace。
type Host struct {HostName string `short:"N" long:"hostname" description:"主机名"`HostMac  string `short:"M" long:"hostmac" description:"主机mac"`}// 在扫描类型中继续分组type ScanType struct {HttpType string `short:"T" long:"http" description:"http扫描"`DataBase string `short:"D" long:"database" description:"数据库扫描"`Other    string `short:"O" long:"other" description:"其他扫描"`}type Scan struct {BasicScan ScanType `group:"scantype" namespace:"scantype"`ScanPort  int      `short:"P" long:"scanport" description:"扫描端口"`ScanIP    string   `short:"I" long:"scanip" description:"扫描ip"`}

子命令

简单的来说:go version 这个 version就是子命令,不用带-,直接用的就是子命令,-version 这种带-的就是选项而不是子命令哈,注意一个符号的区别。


同时记住一点:子命令在flags包中也自动实现了-h /h命令,所以不用编写帮助信息。
(但是你想要实现不添加-h /h 就实现比如 xx.exe finger 也能给出帮助信息的话就要在接口中实现了,后续会在finger中讲明白)

version
  • 先实现version子命令
    继承了flags.Command的Execute接口就成功实现了子命令了,只剩下注册到主要的结构体中,也就是之前学到的需要一个结构体注册选项
    (tips:version的结构体为空,不是拿来切割或者分组,只是一个显示版本号,后面讲finger的时候他才是作为这个分组命令来弄)
//给一个空的,因为version一般都不需要什么其他参数来辅助就可以看到版本了
type ChildCommand struct {}// 继承了flags.Command即可自动调用func (c *ChildCommand) Execute(args []string) error {fmt.Println("version: 1.0.0")return nil}
  • 注册子命令到主选项结构体中,这里才是给到flags解析的结构体,注意这里给的键不再是short/long,而是command
type VOption struct {Version ChildCommand `command:"version" description:"Version显示版本信息"`}

运行效果没问题(源码稍后放)

finger(测试)

finger来加深理解
一般指纹识别的都是xx.exe finger -u xxx -p xxx
所以我认为用这个例子非常好

  • 依旧是先做好一个子命令,但是这里要给子命令上两个选项,用来指纹识别的ip和端口
    同时要记得实现接口Execute
// 模拟一下指纹扫描中常见的一个子命令type Finger struct {U string `short:"u" long:"url" description:"url"`P string `short:"p" long:"port" description:"port"`}func (c *Finger) Execute(args []string) error {if c.U == "" || c.P == "" {// 如果没有提供参数,显示帮助信息,尽量做的完美一点parser := flags.NewParser(c, flags.Default)parser.WriteHelp(os.Stdout)return nil}return nil}
  • 在主结构体中注册这个子命令
    我就直接在之前的VOption结构体注册了
type VOption struct {Version ChildCommand `command:"version" description:"Version显示版本信息"`// 指纹扫描Finger Finger `command:"finger" description:"Finger指纹扫描"`}

注册完成就可以用了

  • 加帮助参数
  • 这个没有加参数 -h 或者 /h等等

以上就是flags包的一些基础常用的内容了,拿到参数之后就是往后丢给你自己写的功能函数即可。

所有测试源码

test1 基础使用测试、test2分组测试 和 test3子命令 自己看着用就行。

package mainimport ("fmt""log""os""github.com/jessevdk/go-flags")// 参数选项type Option struct {//所有结构体首字母一定要大写,否则解析不了,但是short或者long的名字就随便你起V     string   `short:"v" long:"verbose" description:"显示详细信息"`Vlist []string `short:"V" long:"verbose-list" description:"显示详细信息列表"`I     int      `short:"i" long:"input" description:"int类型测试"`//这里可以给了一个默认值default:"xxx",不给的话在不使用该参数的时候就不用调用那个函数P      func(string)   `short:"p" long:"print" description:"打印"` // default:"myPrint"IntMap map[string]int `short:"m" long:"intmap" description:"intmap"`}// 打印功能func myPrint(str string) {fmt.Println("打印-p参数值:", str)}// basic 分组type Basic struct {HostOption Host `group:"host" namespace:"Host"`ScanOption Scan `group:"scan" namespace:"Scan"`}type Host struct {HostName string `short:"N" long:"hostname" description:"主机名"`HostMac  string `short:"M" long:"hostmac" description:"主机mac"`}// 在扫描类型中继续分组type ScanType struct {HttpType string `short:"T" long:"http" description:"http扫描"`DataBase string `short:"D" long:"database" description:"数据库扫描"`Other    string `short:"O" long:"other" description:"其他扫描"`}type Scan struct {BasicScan ScanType `group:"scantype" namespace:"scantype"`ScanPort  int      `short:"P" long:"scanport" description:"扫描端口"`ScanIP    string   `short:"I" long:"scanip" description:"扫描ip"`}type ChildCommand struct {}// 继承了flags.Command即可自动调用func (c *ChildCommand) Execute(args []string) error {fmt.Println("version: 1.0.0")return nil}// 模拟一下指纹扫描中常见的一个子命令type Finger struct {U string `short:"u" long:"url" description:"url"`P string `short:"p" long:"port" description:"port"`}func (c *Finger) Execute(args []string) error {if c.U == "" || c.P == "" {// 如果没有提供参数,显示帮助信息parser := flags.NewParser(c, flags.Default)parser.WriteHelp(os.Stdout)return nil}return nil}type VOption struct {Version ChildCommand `command:"version" description:"Version显示版本信息"`// 指纹扫描Finger Finger `command:"finger" description:"Finger指纹扫描"`}func test3() {parser := flags.NewParser(&VOption{}, flags.Default)_, err := parser.Parse()if err != nil {if flagsErr, ok := err.(*flags.Error); ok && flagsErr.Type == flags.ErrHelp {return // 帮助信息已打印,直接退出}//如果不是打印的帮助信息报错的话就直接log就行log.Println("parses failed: ", err)return}}func test1() {var opt Option  //定义一个选项opt.P = myPrint //把打印函数赋值给Pparser := flags.NewParser(&opt, flags.Default)_, err := parser.Parse()if err != nil {if flagsErr, ok := err.(*flags.Error); ok && flagsErr.Type == flags.ErrHelp {return // 帮助信息已打印,直接退出}//如果不是打印的帮助信息报错的话就直接log就行log.Println("parses failed: ", err)return}fmt.Println("--------------------------")fmt.Println("打印-v参数值:", opt.V)fmt.Println("打印-V 列表所有的参数值:", opt.Vlist)fmt.Println("打印-i参数值:", opt.I)fmt.Println("打印--intmap参数值:", opt.IntMap)}func test2() {var BasicOption Basicparser := flags.NewParser(&BasicOption, flags.Default)_, err := parser.Parse()if err != nil {if flagsErr, ok := err.(*flags.Error); ok && flagsErr.Type == flags.ErrHelp {return // 帮助信息已打印,直接退出}//如果不是打印的帮助信息报错的话就直接log就行log.Println("parses failed: ", err)return}fmt.Println("--------------------------")}func main() {// test1()// test2()test3()}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/diannao/74483.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

eclipse [jvm memory monitor] SHOW_MEMORY_MONITOR=true

eclipse虚拟机内存监控设置SHOW_MEMORY_MONITORtrue D:\eclipse-jee-oxygen-2-win32-x86_64\workspace\.metadata\.plugins\org.eclipse.core.runtime\.settings org.eclipse.ui.prefs (文件比较多,别找错了) SHOW_MEMORY_MONITORtrue 重启 -xms 1024…

量子计算与人工智能的融合:下一代算力革命

1. 引言:算力需求的飞速增长与量子计算的潜力 在信息技术飞速发展的今天,人工智能(AI)已经渗透到我们生活的方方面面,从智能助手到自动驾驶,再到医疗诊断,AI 的应用场景日益广泛。然而&#xf…

【网络】网关

【网络】网关 网关 是计算机网络中用于连接两个不同网络的设备或服务器,它充当着“翻译器”和“转发器”的角色,将数据包从一个网络传递到另一个网络,并在必要时进行协议转换和数据重包装。 主要功能 数据转发:当本地网络设备发…

Axure大屏可视化模板:赋能多领域,开启数据展示新篇章

在当今这个数据爆炸的时代,数据已经成为各行各业的核心资产。然而,如何高效、直观地展示数据,并将其转化为有价值的决策依据,成为了许多企业和组织面临的共同挑战。Axure大屏可视化模板,作为一款强大的数据展示工具&am…

数据不外传!通过内网穿透实现绿联NAS远程访问的安全配置方案

文章目录 前言1. 开启ssh服务2. ssh连接3. 安装cpolar内网穿透4. 配置绿联NAS公网地址 前言 大家好,今天要带给大家一个超级酷炫的技能——如何让绿联NAS秒变‘千里眼’,通过简单的几步操作就能轻松实现内网穿透。想象一下,无论你身处何地&a…

面试题精选《剑指Offer》:JVM类加载机制与Spring设计哲学深度剖析-大厂必考

一、JVM类加载核心机制 🔥 问题5:类从编译到执行的全链路过程 完整生命周期流程图 关键技术拆解 编译阶段 查看字节码指令:javap -v Robot.class 常量池结构解析(CONSTANT_Class_info等) 类加载阶段 // 手动加载…

WordPress分类目录绑定二级域名插件

一.子域名访问形式 1.wordpress 分类目录 转换为 子域名 (绑定二级域名)形式 2.wordpress 页面转换为 子域名 (绑定二级域名) 形式 3.wordpress 作者页转换为 子域名 (绑定二级域名)形式 4.为不同子域名…

Shopify Checkout UI Extensions

结账界面的UI扩展允许应用开发者构建自定义功能,商家可以在结账流程的定义点安装,包括产品信息、运输、支付、订单摘要和Shop Pay。 Shopify官方在去年2024年使用结账扩展取代了checkout.liquid,并将于2025年8月28日彻底停用checkout.liquid…

华为HCIE方向那么多应该如何选择?

在华为认证体系里,HCIE作为最高等级的认证,是ICT领域专业实力的有力象征。HCIE设置了多个细分方向,这些方向宛如不同的专业赛道,为期望在ICT行业深入发展的人提供了丰富的选择。今天,咱们就来好好聊聊华为HCIE方向的相…

FastGPT原理分析-数据集创建第二步:处理任务的执行

概述 文章《FastGPT原理分析-数据集创建第一步》已经分析了数据集创建的第一步:文件上传和预处理的实现逻辑。本文介绍文件上传后,数据处理任务的具体实现逻辑。 数据集创建总体实现步骤 从上文可知数据集创建总体上来说分为两大步骤: &a…

vue中keep-alive组件的使用

keep-alive是vue的内置组件,它的主要作用是对组件进行缓存,避免组件在切换时被重复创建和销毁,从而提高应用的性能和用户体验。它自身不会渲染一个 DOM 元素,也不会出现在父组件链中。使用时,只需要将需要缓存的组件包…

进程间通信(匿名管道) ─── linux第22课

目录 进程间通信 进程间通信目的 进程间通信的发展 进程间通信分类 1. 管道 2. System V IPC 3. POSIX IPC 管道 什么是管道 站在文件描述符角度-深度理解管道 站在内核角度-管道本质 ​编辑 匿名管道 测试匿名管道的读写 匿名管道的四大现象: 匿…

架构思维:通用系统设计方法论_从复杂度分析到技术实现指南

文章目录 Question订单履约原始架构痛点目标架构架构图说明关键设计点优点 设计方法论复杂来源解决方案评估标准从设计原则出发 技术实现 (以选型Redis为例)Redis消息队列的实现细节高可用设计 总结 Question 我们经常聊如何设计一个比较完善的系统&…

Excel(实战):INDEX函数和MATCH函数、INDEX函数实战题

目录 经典用法两者嵌套查值题目解题分析 INDEX巧妙用法让数组公式,自动填充所有、有数据的行/列INDEX函数和SEQUENCE函数 经典用法两者嵌套查值 题目 根据左表查询这三个人的所有数据 解题分析 INDEX函数的参数:第1个参数是选定查找范围&#xff0c…

ECharts仪表盘-仪表盘25,附视频讲解与代码下载

引言: ECharts仪表盘(Gauge Chart)是一种类似于速度表的数据可视化图表类型,用于展示单个或多个变量的指标和状态,特别适用于展示指标的实时变化和状态。本文将详细介绍如何使用ECharts库实现一个仪表盘,…

清华大学.智灵动力-《DeepSeek行业应用实践报告》附PPT下载方法

导 读INTRODUCTION 今天分享是由清华大学.智灵动力:《DeepSeek行业应用实践报告》,主要介绍了DeepSeek模型的概述、优势、使用技巧、与其他模型的对比,以及在多个行业中的应用和未来发展趋势。为理解DeepSeek模型的应用和未来发展提供了深入的…

VSCODE上ckg_server_linux进程占用CPU过多

现象描述 每次一打开VSCODE,ckg_server_linux进程就启动了,并且一直运行,且占用CPU过高; 推测应该是某个插件的问题导致的; 问题处理 本地搜索了一下,发现是 marscode插件影响的; 禁用marsc…

【大模型理论篇】CogVLM:多模态预训练语言模型

1. 模型背景 前两天我们在《Skywork R1V: Pioneering Multimodal Reasoning with Chain-of-Thought》中介绍了将ViT与推理模型结合构造多模态推理模型的案例,其中提到了VLM的应用。追溯起来就是两篇前期工作:Vision LLM以及CogVLM。 今天准备回顾一下Cog…

2021年蓝桥杯第十二届CC++大学B组真题及代码

目录 1A:空间(填空5分_单位转换) 2B:卡片(填空5分_模拟) 3C:直线(填空10分_数学排序) 4D:货物摆放(填空10分_质因数) 5E&#xf…

Python入门基础

python基础类型转换 str()与int()类型转换 name 张三 age 20 print(type(name),type(age))print(我叫name 今年, str(age)岁 )a10 b198.8 cFalse print(type(a),type(b),type(c)) print(str(a),str(b),str(c))s1 128 f198.7 s276.77 ffTrue s3hello print(type(s…