共享变量

共享变量

一、PublicVar

通过PublicVar实现共享,有两种方式:

1)修改代码,每次升级时修改对应变量值

2)无需修改代码,通过ldflags在编译时指定变量值

1、ldflags使用示例

1
2
3
4
5
6
7
8
9
10
11
// main.go
package main

import "fmt"

var Version = ""

func main() {
fmt.Println("Version", Version)
// ...
}

go build -ldflags "-X main.Version=1.0.0" -x -o product main.go

2、共享变量

优点
  • 使用简单
缺点
  • 使用方必须引入共享变量所在module
  • 存在package cycle import依赖风险

推荐建立单独环境module,只用来定义变量,避免循环package依赖风险。

二、运行时传参

执行go程序编译后的二进制产物时,增加参数。若当前编译出的二进制产物为go-product。

1
go-prudct -psm a.b.c -conf-dir conf
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
package main

import (
"flag"
"fmt"
)

var psm string
var confDir string

func main() {
printOsArgs()
parseFlag()
lookupFlag()
}

func printOsArgs() {
for idx, arg := range os.Args {
fmt.Println(idx, arg)
}
}

func parseFlag() {
// 相同的Flag name只能解析一次
flag.StringVar(&psm, "psm", "default", "PSM")
flag.StringVar(&confDir, "conf-dir", "default", "config directory")
if !flag.Parsed() {
flag.Parse()
}
fmt.Println("psm", psm)
fmt.Println("confDir", confDir)
}

func lookupFlag() {
fmt.Println("flag.Lookup psm", flag.Lookup("psm").Value)
}

1、共享变量

1)os.Args直接获取运行参数

优点
  • 使用方无需引入多余module
缺点
  • 需要自行解析参数,解析稍显麻烦

2)flag解析运行参数

  • flag.Parse方法调用前,所定义的flag 必须不少于 实际的flag,否则解析会异常
  • flag.Parse方法调用后,不允许再次定义flag,解析前先判断flag.Parsed()
优点
  • 使用方无需引入多余module
缺点
  • 由于执行顺序无法保证,所以使用方必须都有以下逻辑
    • 判断flag是否已解析过
    • 若未解析过,则定义所有flag,然后进行解析
    • 如果解析过,则通过flag.Lookup查找指定变量

三、os environment

设置操作系统环境变量,go通过os.Getenv()获取。

1、共享变量

优点
  • 使用方无需引入多余module
  • 获取逻辑简单
缺点
  • 不适合于操作系统内运行多个差异化实例场景

四、第三方存储

借助本地文件、数据库等存储。

评论