如何在Reflect.FieldByName()

时间:2018-05-14 07:33:25

标签: go

我将数据传递给带有输入类型接口的func。

此代码:

main(){
    SampleData := Input{
    Recipients: []string{"abc","efg"},
    Msg:        string("Test message"),
    }
    InsertInSendTBL(SampleData)
}

type Input struct {
    Recipients []string
    Msg        string
    sender      string
}
type Output struct {
    Recipients    []string
    Msg           string
    reciver     string
}
func InsertInSendTBL(Data interface{}) {
    DataInput := reflect.ValueOf(Data)
    NewVal := Output{
        Recipients: DataInput.FieldByName("Recipients").([]string{}),//LINE ERORE
        Msg:        DataInput.FieldByName("Msg").String(),
        sender:     "1000",
    }
}

我的一个结构字段是字符串切片。我在反射包中搜索但没有找到任何东西所以我使用“。([] string {})”。 结果是这个错误:

  

无效的类型断言:DataInput.FieldByName(“Recipients”)。(composite literal)(左边的非接口类型reflect.Value)

所以我尝试接口反射但是另一个错误

  

不能使用DataInput.FieldByName(“Recipients”)。Interface()(类型interface {})作为字段值类型[]字符串:需要类型断言

1 个答案:

答案 0 :(得分:3)

您需要结合两次尝试:

sliceOfString, ok := DataInput.FieldByName("Recipients").Interface().([]string)
if !ok {
    panic("Not a []string!")
}