阅读本文前,需具备flag基础

通常我们有种需求:可以在不修改程序源码的情况下,控制一些程序内部的变化。比如配置文件,我们可以手动更改配置文件,也可以在程序启动时,通过命令行参数在程序运行时,给程序提供一些配置选项,这样可以方便地不需要更改程序源码就可以达到在外部控制程序内部一些变化。

以下是通过命令行操作给项目地配置文件进行动态指定,这样就可以不用手动修改配置文件了(比较在非图形化的 Linux 上部署服务,直接通过命令行实现配置文件内容变化算是比直接修改要方便一点点

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
// @author cold bin
// @date 2022/7/17

package main

import (
	"flag"
	"fmt"
	"log"
	"time"
)

/*
	命令行操作结合配置文件进行操作,命令行提供默认操作
*/

func main() {
	var port, mode, StartTime, loglevel string
	//使用命令前需要先解析
	flag.Parse()
	args := flag.Args()
	fmt.Println(args)
	if len(args) <= 0 {
		log.Println("请输入命令参数")
		return
	}

	//子命令
	switch args[0] {
	case "conf":
		cmdSet := flag.NewFlagSet("conf", flag.ExitOnError)

		cmdSet.StringVar(
			&port,
			"port",
			"8080",
			"指定项目运行监听端口",
		)
		cmdSet.StringVar(
			&port,
			"p",
			"8080",
			"指定项目运行监听端口",
		)

		cmdSet.StringVar(
			&mode,
			"mode",
			"debug",
			"指定项目启动模式,默认debug为开发模式,release为发布模式,test为测试模式",
		)
		cmdSet.StringVar(
			&mode,
			"m",
			"debug",
			"指定项目启动模式,默认debug为开发模式,release为发布模式,test为测试模式",
		)

		cmdSet.StringVar(
			&StartTime,
			"time",
			time.Now().Format("2006-01-02"),
			"项目的启动时间,未指定时,默认当前系统时间",
		)
		cmdSet.StringVar(
			&StartTime,
			"t",
			time.Now().Format("2006-01-02"),
			"项目的启动时间,未指定时,默认当前系统时间",
		)

		cmdSet.StringVar(
			&loglevel,
			"logLevel",
			"debug",
			"默认日志是warning级别,还有debug、error级别",
		)
		cmdSet.StringVar(
			&loglevel,
			"l",
			"debug",
			"默认日志是warning级别,还有debug、error级别",
		)
		//使用命令前需要解析
		_ = cmdSet.Parse(args[1:])

		fmt.Println(port, mode, StartTime, loglevel)
	case "java":
		log.Println("java命令")
	default:
		log.Fatal("命令错误")
	}
}

当然也可以将出现地常量或字符串进行更好的迁移,使用有意义地变量名代替阅读观感更佳