亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

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

如何將結構轉換為平面路徑數組?

如何將結構轉換為平面路徑數組?

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

1 回答

?
千萬里不及你

TA貢獻1784條經驗 獲得超9個贊

您必須自己編寫代碼,并進行反思。


這是一個演示函數,可打印您提供的輸出:


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

}

將打印:

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

注意:

  • 反射會帶來性能損失;如果您對此感到擔憂,您應該分析相關的代碼路徑以查看它是否會破壞交易

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

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

游樂場: https: //play.golang.org/p/isNFSfFiXOP




查看完整回答
反對 回復 2022-10-10
  • 1 回答
  • 0 關注
  • 104 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號