不负相思意
总之,有没有办法将任何字符串转换为函数/方法。我不确定你想在这里实现什么。这没有任何意义。通常,要使用命令行参数填充结构字段,您可以执行以下操作。package mainimport ( "fmt" "log" "strconv" "os")type Options struct { Field1 string Field2 int64}func main() { if len(os.Args) < 2 { log.Fatal("missing two required positional arguments: Field1 and Field2") } opts := &Options{} opts.Field1 = os.Args[1] var err error opts.Field2, err = strconv.ParseInt(os.Args[2], 10, 64) if err != nil { log.Fatalf("failed to parse integer value: %v", os.Args[2]) } fmt.Println(opts)}为了让您的生活更轻松,您可以使用flag(或pflag)包将输入参数声明为命令行标志。import ( "flag" "fmt")type Options struct { Field1 string Field2 int}var opts Optionsfunc init() { flag.StringVar(&opts.Field1, "field1", "", "help message for field1") flag.IntVar(&opts.Field2, "field2", 0, "help message for field2") flag.Parse()}func main() { fmt.Println(opts)}或者,就像@Jomaar 回答的那样,您可以使用帮助程序库go-arg来避免手动声明命令行标志。另一种选择是go-flags.编辑在进一步澄清之后,您似乎希望使用编写器有选择地编写结构的字段,并且您希望使用位置命令行参数来指定要写入的字段。我认为map在这种情况下存储选项将是一种更合适的数据结构,因为它允许您使用它们的string键简单地引用字段。import ( "fmt" "os")func main() { options := map[string]interface{} { "field1": "some-value", "field2": 1, } for _, arg := range os.Args[1:] { if val, ok := options[arg]; ok { fmt.Println(val) } }}如果要继续使用结构,可以使用reflect包。import ( "fmt" "os" "reflect")type Options struct { Field1 string Field2 int}func main() { opts := &Options{Field1: "some-value", Field2: 1} for _, arg := range os.Args[1:] { fmt.Println(getAttr(opts, arg)) }}// copied from https://stackoverflow.com/a/66470232/2410641func getAttr(obj interface{}, fieldName string) (reflect.Value, error) { pointToStruct := reflect.ValueOf(obj) // addressable curStruct := pointToStruct.Elem() if curStruct.Kind() != reflect.Struct { return reflect.Value{}, fmt.Errorf("obj is not a struct") } curField := curStruct.FieldByName(fieldName) // type: reflect.Value if !curField.IsValid() { return reflect.Value{}, fmt.Errorf("field not found: %s", fieldName) } return curField, nil}Go Playground 演示: https: //play.golang.org/p/sch53l2bq4O