我正在尝试做这样的事情:使用名为 的标签定义结构env:type Env struct { Port string `env:"PORT"`}调用一些函数来获取环境变量名称os.Getenv并将其设置在结构中。现在,我有这个:package mainimport ( "fmt" "os" "reflect")func ParseEnv(t interface{}, v interface{}) { it := reflect.TypeOf(t) for i := 0; i < it.NumField(); i++ { field := it.Field(i) value := os.Getenv(field.Tag.Get("env")) if value == "" { continue } reflect.ValueOf(v).Elem().FieldByName(field.Name).SetString(value) }}type Env struct { Port string `env:"PORT"` DatabaseURL string `env:"DATABASE_URL"`}func main() { os.Setenv("PORT", "8080") os.Setenv("DATABASE_URL", "postgres://user:pass@host:5432/my-db") env := Env{} ParseEnv(env, &env) fmt.Println(env)}http://play.golang.org/p/b8uPPVo4aV但是,正如您所看到的,我必须将引用和指针都传递给我的函数。虽然这有效,但它非常丑陋(至少我认为是)。如果我尝试仅传递指针,则无法获得正确的类型(因为它将是*interface{}),并且如果我仅传递引用,则无法使用设置值reflect(即使可以,也不会工作)。有没有一种理智的方法来做到这一点?
1 回答
- 1 回答
- 0 关注
- 158 浏览
添加回答
举报
0/150
提交
取消