我有两个结构:
type A struct {
BankCode string `json:"bankCode"`
BankName string `json:"bankName"`
}
和
type B struct {
A
extra string `json:" extra"`
}
两片:
listsA []A
和listsB []B
我想从bankCodes
和listA
获取listB
。 bankcodes
仅包含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
}
如何使用一个常用功能?
答案 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
}