Golang将列表对象转换为字符串

时间:2016-09-14 09:56:05

标签: go go-reflect

我有两个结构:

type A struct {
    BankCode           string `json:"bankCode"`
    BankName           string `json:"bankName"`
}

type B struct {
    A 
    extra           string `json:" extra"`
}

两片:
listsA []AlistsB []B 我想从bankCodeslistA获取listBbankcodes仅包含bankcodes。这是一个[]string

使用两个功能会很容易。

func getBankCodes(data []A) []string {
    res := make([]string, len(data))
    for i := 0; i < len(data); i++ {
        res[i] = data[i].BankCode
    }
    return res
}

func getBankCodes(data []B) []string {
    res := make([]string, len(data))
    for i := 0; i < len(data); i++ {
        res[i] = data[i].BankCode
    }
    return res
}

如何使用一个常用功能?

2 个答案:

答案 0 :(得分:0)

干净的解决方案是使用界面,因为go不支持经典继承,所以// GetBankCoder provides a function that gives the BankCode type GetBankCoder interface { getBankCode() string } // implement GetBankCoder for A (and indirectly for B) func (a A) getBankCode() string { return a.BankCode } 之类的东西不起作用。然而,接口只能描述函数而不是公共字段,所以你必须实现一个Getter(本质上)。

getBankCodes

并使func getBankCodes(data []GetBankCoder) []string { // <-- changed res := make([]string, len(data)) for i := 0; i < len(data); i++ { res[i] = data[i].getBankCode() // <-- changed } return res } 在该接口类型上工作,注意函数的参数以及循环内的语句:

interface{}

还有其他解决方案,其中函数参数为.BankCode类型,然后使用反射来确保您可以实际执行[]GetBankCoder,但我不喜欢这些,因为它们不是增加更多的清晰度。

...但是,在将它提供给函数之前,我无法让golang游乐场正常工作而不将其放入banks := make([]GetBankCoder, 0) banks = append(banks, A{ BankCode: "ABC", BankName: "ABC Bank"}) getBankCodes(banks) var中。

{{1}}

答案 1 :(得分:0)

您可以使用一个常见功能:

    <android.support.design.widget.AppBarLayout
        android:id="@+id/app_bar"
        android:layout_width="match_parent"
        android:layout_height="@dimen/app_bar_height"
        android:fitsSystemWindows="true"
        android:theme="@style/AppTheme.AppBarOverlay">

        <android.support.design.widget.CollapsingToolbarLayout
            android:id="@+id/toolbar_layout"
            android:layout_width="match_parent"
            android:layout_height="match_parent"
            android:fitsSystemWindows="true"
            app:contentScrim="?attr/colorPrimary"
            app:layout_scrollFlags="scroll|exitUntilCollapsed">

            <android.support.v7.widget.Toolbar
                android:id="@+id/toolbar"
                android:layout_width="match_parent"
                android:layout_height="?attr/actionBarSize"
                app:layout_collapseMode="pin"
                app:popupTheme="@style/AppTheme.PopupOverlay" />

        </android.support.design.widget.CollapsingToolbarLayout>
    </android.support.design.widget.AppBarLayout>

    <include layout="@layout/content_user_profile" />

    <android.support.design.widget.FloatingActionButton
        android:id="@+id/fab"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_margin="@dimen/fab_margin"
        app:layout_anchor="@id/app_bar"
        app:layout_anchorGravity="bottom|end"
        android:src="@drawable/ic_chat_white_24dp" />

    <android.support.design.widget.FloatingActionButton
        android:id="@+id/fab2"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_margin="@dimen/fab_margin"
        app:layout_anchor="@id/fab"
        app:layout_anchorGravity="left|center"
        android:src="@drawable/ic_person_add_white_24dp"/>

</android.support.design.widget.CoordinatorLayout>

代码(试试The Go Playground):

func BankCodes(data interface{}) []string {
    if reflect.TypeOf(data).Kind() != reflect.Slice {
        panic("err: data is not slice")
    }
    slice := reflect.Indirect(reflect.ValueOf(data))
    res := make([]string, slice.Len())
    for i := 0; i < slice.Len(); i++ {
        a := slice.Index(i).Interface().(BankCoder)
        res[i] = a.Bankcode()
    }
    return res
}