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

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

如何按字母順序對結構字段進行排序

如何按字母順序對結構字段進行排序

Go
搖曳的薔薇 2021-10-18 10:59:19
如何獲得按字段排序的結構輸出?type T struct {    B int    A int}t := &T{B: 2, A: 1}doSomething(t)fmt.Println(t)  // &{1 2} --> Sorted by fields
查看完整描述

2 回答

?
大話西游666

TA貢獻1817條經驗 獲得超14個贊

Astruct是字段的有序集合。該fmt包使用反射來獲取值的字段和值struct,并按照定義的順序生成輸出。


因此,最簡單的解決方案是聲明您的類型,其中您已經按字母順序排列了您的字段:


type T struct {

    A int

    B int

}

如果你不能修改字段的順序(例如內存布局很重要),你可以Stringer通過String()為你的結構類型指定一個方法來實現接口:


func (t T) String() string {

    return fmt.Sprintf("{%d %d}", t.A, t.B)

}

該fmt包檢查傳遞的值是否實現Stringer,如果實現,則調用其String()方法來生成輸出。


該解決方案的缺點是這不靈活(例如,如果您添加一個新字段,您也必須更新該String()方法),而且您還必須為struct您希望它工作的每種類型都這樣做(并且您不能定義方法)對于其他包中定義的類型)。


完全靈活的解決方案可以使用反射。您可以獲取字段的名稱,按名稱對其進行排序,然后遍歷排序后的名稱并獲取字段值(按名稱)。


該解決方案的優點是它適用于 any struct,并且即使您在結構中添加或刪除字段,它也可以繼續工作而無需修改。它也適用于任何類型的字段,而不僅僅是int字段。


這是一個如何做到的示例(在Go Playground上嘗試):


func printFields(st interface{}) string {

    t := reflect.TypeOf(st)


    names := make([]string, t.NumField())

    for i := range names {

        names[i] = t.Field(i).Name

    }

    sort.Strings(names)


    v := reflect.ValueOf(st)

    buf := &bytes.Buffer{}

    buf.WriteString("{")

    for i, name := range names {

        val := v.FieldByName(name)

        if !val.CanInterface() {

            continue

        }

        if i > 0 {

            buf.WriteString(" ")

        }

        fmt.Fprintf(buf, "%v", val.Interface())

    }

    buf.WriteString("}")


    return buf.String()

}


查看完整回答
反對 回復 2021-10-18
?
哈士奇WWW

TA貢獻1799條經驗 獲得超6個贊

T執行斯金格接口(見包裝FMT),并請執行打印一份天體B中。

順便提一句。這是一個愚蠢的想法。


查看完整回答
反對 回復 2021-10-18
  • 2 回答
  • 0 關注
  • 176 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

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

幫助反饋 APP下載

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

公眾號

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