访问接口内部的结构值



我有一个类似于-的接口{}

Rows interface{}

Rows接口中,我放入ProductResponse结构。

type ProductResponse struct {
CompanyName     string                        `json:"company_name"`
CompanyID       uint                          `json:"company_id"`
CompanyProducts []*Products                   `json:"CompanyProducts"`
}
type Products struct {
Product_ID          uint      `json:"id"`
Product_Name        string    `json:"product_name"`
}

我想访问产品名称值。如何访问此。我可以通过使用"CompanyName"来访问外部值(CompanyName、CompanyID(反射";pkg。

value := reflect.ValueOf(response)
CompanyName := value.FieldByName("CompanyName").Interface().(string)

我无法访问产品结构值。如何做到这一点?

您可以使用类型断言:

pr := rows.(ProductResponse)
fmt.Println(pr.CompanyProducts[0].Product_ID)
fmt.Println(pr.CompanyProducts[0].Product_Name)

或者您可以使用reflect软件包:

rv := reflect.ValueOf(rows)
// get the value of the CompanyProducts field
v := rv.FieldByName("CompanyProducts")
// that value is a slice, so use .Index(N) to get the Nth element in that slice
v = v.Index(0)
// the elements are of type *Product so use .Elem() to dereference the pointer and get the struct value
v = v.Elem()
fmt.Println(v.FieldByName("Product_ID").Interface())
fmt.Println(v.FieldByName("Product_Name").Interface())

https://play.golang.org/p/RAcCwj843nM

与其使用反射,不如使用类型断言。

res, ok := response.(ProductResponse) 
if ok { // Successful
res.CompanyProducts[0].Product_Name // Access Product_Name or Product_ID
} else {
// Handle type assertion failure 
}

您可以访问Product_Name值,甚至不需要使用"反射";pkg,只需使用for循环在CompanyProducts切片上迭代即可。我为您创建了一个简单的程序,如下所示:

package main
import (
"fmt"
)
type ProductResponse struct {
CompanyName     string      `json:"company_name"`
CompanyID       uint        `json:"company_id"`
CompanyProducts []*Products `json:"CompanyProducts"`
}
type Products struct {
Product_ID   uint   `json:"id"`
Product_Name string `json:"product_name"`
}
func main() {
var rows2 interface{} = ProductResponse{CompanyName: "Zensar", CompanyID: 1001, CompanyProducts: []*Products{{1, "prod1"}, {2, "prod2"}, {3, "prod3"}}}
for i := 0; i < len(rows2.(ProductResponse).CompanyProducts); i++ {
fmt.Println(rows2.(ProductResponse).CompanyProducts[i].Product_Name)
}
}

输出:

prod1
prod2
prod3

相关内容

  • 没有找到相关文章

最新更新