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

為了賬號(hào)安全,請(qǐng)及時(shí)綁定郵箱和手機(jī)立即綁定
已解決430363個(gè)問題,去搜搜看,總會(huì)有你想問的

如何將結(jié)構(gòu)轉(zhuǎn)換為平面路徑數(shù)組?

如何將結(jié)構(gòu)轉(zhuǎn)換為平面路徑數(shù)組?

Go
精慕HU 2022-10-10 19:13:06
例如,如果我有一個(gè)結(jié)構(gòu),例如:type Example struct {   Foo string   Bar string   Baz struct{     A int     B string   }   Qux []string}將其轉(zhuǎn)換為表示每個(gè)結(jié)構(gòu)字段的點(diǎn)路徑的扁平字符串切片的最佳方法是什么?我想要一個(gè)類似于以下切片的輸出:["Example.Foo", "Example.Bar", "Example.Baz.A", "Example.Baz.B", "Example.Qux.0", "Example.Qux.1"]確切的結(jié)構(gòu)將在編譯時(shí)知道。此外,從結(jié)構(gòu)到平面列表的轉(zhuǎn)換處于熱門路徑,因此性能將是一個(gè)重要的考慮因素。任何提示將不勝感激!
查看完整描述

1 回答

?
千萬(wàn)里不及你

TA貢獻(xiàn)1784條經(jīng)驗(yàn) 獲得超9個(gè)贊

您必須自己編寫代碼,并進(jìn)行反思。


這是一個(gè)演示函數(shù),可打印您提供的輸出:


package main


import (

"fmt"

    "reflect"

    "strconv"

)


type Example struct {

    Foo string

    Bar string

    Baz struct{

        A int

        B string

    }

    Qux []string

}


func main() {

    example := Example{Qux: []string{"a", "b"}}

    t := reflect.ValueOf(example)

    prefix := t.Type().Name()

    fmt.Println(ToPathSlice(t, prefix, make([]string, 0)))

}


func ToPathSlice(t reflect.Value, name string, dst []string) []string {

    switch t.Kind() {

    case reflect.Ptr, reflect.Interface:

        return ToPathSlice(t.Elem(), name, dst)


    case reflect.Struct:

        for i := 0; i < t.NumField(); i++ {

            fname := t.Type().Field(i).Name

            dst = ToPathSlice(t.Field(i), name+"."+fname, dst)

        }


    case reflect.Slice, reflect.Array:

        for i := 0; i < t.Len(); i++ {

            dst = ToPathSlice(t.Index(i), name+"."+strconv.Itoa(i), dst)

        }


    default:

        return append(dst, name)

    }

    return dst

}

將打?。?/p>

[Example.Foo Example.Bar Example.Baz.A Example.Baz.B Example.Qux.0 Example.Qux.1]

注意:

  • 反射會(huì)帶來(lái)性能損失;如果您對(duì)此感到擔(dān)憂,您應(yīng)該分析相關(guān)的代碼路徑以查看它是否會(huì)破壞交易

  • 上面的代碼是人為的,例如它不處理地圖,它不處理nil等等;你可以自己擴(kuò)展它

  • 在您想要的輸出中,將打印切片/數(shù)組字段的索引。切片沒有數(shù)組的固有長(zhǎng)度。為了知道切片的長(zhǎng)度,您必須使用reflect.Value. 這個(gè) IMO 使代碼更加尷尬。如果您可以接受不打印切片索引,那么您可以使用reflect.Type.

游樂場(chǎng): https: //play.golang.org/p/isNFSfFiXOP




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

添加回答

舉報(bào)

0/150
提交
取消
微信客服

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

幫助反饋 APP下載

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

公眾號(hào)

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