反射:设置一个指针的字段

我正在尝试做这样的事情:


使用名为 的标签定义结构env:


type Env struct {

     Port string `env:"PORT"`

}

调用一些函数来获取环境变量名称os.Getenv并将其设置在结构中。


现在,我有这个:


package main


import (

    "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(即使可以,也不会工作)。


有没有一种理智的方法来做到这一点?


茅侃侃
浏览 162回答 1
1回答
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Go