1 回答

TA貢獻1777條經驗 獲得超10個贊
總之,有沒有辦法將任何字符串轉換為函數/方法。
我不確定你想在這里實現什么。這沒有任何意義。
通常,要使用命令行參數填充結構字段,您可以執行以下操作。
package main
import (
"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 Options
func 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/2410641
func 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
- 1 回答
- 0 關注
- 98 瀏覽
添加回答
舉報