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>