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>