Golang 解析命令行参数并根据可执行文件的扩展名决定是否以 CGI 模式运行

Golang 解析命令行参数并根据可执行文件的扩展名决定是否以 CGI 模式运行

首先,os.Args 是一个字符串切片,包含了命令行参数。os.Args[1:] 表示从第二个参数开始(索引为 1)到最后一个参数的子切片。

接下来,name, _ := os.Executable() 用于获取当前可执行文件的路径。这里使用了一个匿名变量 _ 来忽略可能的错误返回值。

然后,filepath.Base(name) 返回路径中的文件名部分(不包含目录),通过 strings.HasSuffix 函数检查文件名是否以 “.cgi” 结尾。如果是以 “.cgi” 结尾,表示当前可执行文件是一个 CGI 程序。

最后,如果当前可执行文件是 CGI 程序,则将 args 赋值为 []string{“web”, “-cgi”},否则保持不变。

示例代码如下:

package main

import (
	"fmt"
	"os"
	"path/filepath"
	"strings"
)

func main() {
	args := os.Args[1:]
	name, _ := os.Executable()
	// fmt.Println(filepath.Base(name))
	if strings.HasSuffix(filepath.Base(name), ".cgi") {
		args = []string{"web", "-cgi"}
	}

	fmt.Println(args)
}

PS E:\TEXT\test> go run .\main.go
[]
PS E:\TEXT\test> go run .\main.go arg1 arg2
[arg1 arg2]
PS E:\TEXT\test> go run .\main.go arg1 arg2
[arg1 arg2]
PS E:\TEXT\test> go run .\main.go arg1 arg2
[arg1 arg2]
PS E:\TEXT\test> go run .\main.go arg1 arg2
C:\Users\ADMINI~1\AppData\Local\Temp\go-build2201898517\b001\exe\main.exe
[arg1 arg2]
PS E:\TEXT\test> go run .\main.go arg1 arg2
main.exe
[arg1 arg2]
PS E:\TEXT\test> 

假设将该代码保存为 main.go,然后在命令行中执行 go run main.go arg1 arg2,如果当前可执行文件的扩展名是 “.cgi”,则输出结果为 [“web”, “-cgi”];否则输出结果为 [“arg1”, “arg2”],其中 “arg1” 和 “arg2” 是命令行参数。

strings.HasSuffix 是 Go 语言中的一个字符串函数,用于检查一个字符串是否以指定的后缀结尾。

对命令行参数进一步处理

package main

import (
	"fmt"
	"os"
	"path/filepath"
	"strings"
)

func main() {
	args := os.Args[1:]
	if name, _ := os.Executable(); strings.HasSuffix(filepath.Base(name), ".cgi") {
		args = []string{"web", "-cgi"}
	}

	args = CleanUpArgs(args)
	fmt.Println(args)
}

func CleanUpArgs(args []string) []string {
	out := make([]string, 0, len(args))
	for _, arg := range args {
		switch {
		// 如果参数等于 "--authkey" 或 "-authkey",则将参数转换为 "--auth-key"
		case arg == "--authkey", arg == "-authkey":
			arg = "--auth-key"
		// 如果参数以 "--authkey=" 或 "-authkey=" 开头,则进一步处理。
		case strings.HasPrefix(arg, "--authkey="), strings.HasPrefix(arg, "-authkey="):
			arg = strings.TrimLeft(arg, "-")          // 去掉参数开头的 "-" 符号
			arg = strings.TrimPrefix(arg, "authkey=") // 去掉参数中的前缀 "authkey="
			arg = "--auth-key=" + arg                 // 在参数前面添加 "--auth-key=" 前缀
		}
		out = append(out, arg)
	}
	return out
}

PS E:\TEXT\test> go run .\main.go --auth-key=asdfadsf
[--auth-key=asdfadsf]
PS E:\TEXT\test> 
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

知其黑、受其白

喝个咖啡

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值