第七色在线视频,2021少妇久久久久久久久久,亚洲欧洲精品成人久久av18,亚洲国产精品特色大片观看完整版,孙宇晨将参加特朗普的晚宴

為了賬號安全,請及時綁定郵箱和手機(jī)立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

將命令行參數(shù)轉(zhuǎn)換為結(jié)構(gòu)字段

將命令行參數(shù)轉(zhuǎn)換為結(jié)構(gòu)字段

Go
慕斯709654 2022-10-10 19:15:56
我正在嘗試打印一個 JSON(轉(zhuǎn)換為 struct)字段,特別是它作為終端的輸入。type foo struct{ field1 stringfield2 int}這是我創(chuàng)建的結(jié)構(gòu)示例,我想將“field1”作為命令行參數(shù),并通過達(dá)到解碼的 JSON 輸出將其打印到 html 正文或控制臺。通常我可以用這種方式打印它,但我找不到將os.Args[1]值轉(zhuǎn)換為已經(jīng)定義的結(jié)構(gòu)字段的方法。var res *foo_=json.NewDecoder(resp.Body).Decode(&res)fmt.Println(res.field1)總之,有沒有辦法將任何字符串變量轉(zhuǎn)換為函數(shù)/方法。非常感謝提前修訂說明:例如。我會寫信給終端:go run main.go "field1"程序會做這樣的事情fmt.Fprintf(writer, "option.field is %v", someFuncThatConcatenatesThisTwo("option."+ os.Args[1]))順便說一句,要調(diào)用多個字段。預(yù)定義當(dāng)然可以解決某種情況,但我想學(xué)習(xí)的是另一回事。
查看完整描述

1 回答

?
不負(fù)相思意

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


查看完整回答
反對 回復(fù) 2022-10-10
  • 1 回答
  • 0 關(guān)注
  • 105 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補(bǔ)貼
聯(lián)系客服咨詢優(yōu)惠詳情

幫助反饋 APP下載

慕課網(wǎng)APP
您的移動學(xué)習(xí)伙伴

公眾號

掃描二維碼
關(guān)注慕課網(wǎng)微信公眾號