1 回答

TA貢獻(xiàn)1777條經(jīng)驗(yàn) 獲得超10個贊
總之,有沒有辦法將任何字符串轉(zhuǎn)換為函數(shù)/方法。
我不確定你想在這里實(shí)現(xiàn)什么。這沒有任何意義。
通常,要使用命令行參數(shù)填充結(jié)構(gòu)字段,您可以執(zhí)行以下操作。
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)包將輸入?yún)?shù)聲明為命令行標(biāo)志。
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
來避免手動聲明命令行標(biāo)志。另一種選擇是go-flags
.
編輯
在進(jìn)一步澄清之后,您似乎希望使用編寫器有選擇地編寫結(jié)構(gòu)的字段,并且您希望使用位置命令行參數(shù)來指定要寫入的字段。
我認(rèn)為map在這種情況下存儲選項(xiàng)將是一種更合適的數(shù)據(jù)結(jié)構(gòu),因?yàn)樗试S您使用它們的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)
}
}
}
如果要繼續(xù)使用結(jié)構(gòu),可以使用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 關(guān)注
- 105 瀏覽
添加回答
舉報