type User struct {
Id_ bson.ObjectId `bson:"_id"`
Name string `bson:"name"`
Age int `bson:"age"`
Friends []interface{} `bson:"friends"`
}
但是若mondodb中的Friends記錄的是多維的資料,如: [][][]interface{}
確無法單純把定義改為如下,雖然程式執行不會有錯誤,但是資料內容確只有一個空的slice。
type User struct {
Id_ bson.ObjectId `bson:"_id"`
Name string `bson:"name"`
Age int `bson:"age"`
Friends [][][]interface{} `bson:"friends"`
}
或,單一interface{}去接資料,也只是得到一個nil。
type User struct {
Id_ bson.ObjectId `bson:"_id"`
Name string `bson:"name"`
Age int `bson:"age"`
Friends interface{} `bson:"friends"`
}
解決方式: 不定義結構,先用 interface{}將所有欄位資料取回再後續處理
func GetData() {
var i interface{}
var err error
if i, err = mgoDao.GetMongoData(); err == nil && i != nil {
if reflect.TypeOf(i.(bson.M)["friends"]) == reflect.TypeOf([]interface{}{}) {
for _, arr1 := range i.(bson.M)["friends"].([]interface{}) {
if reflect.TypeOf(arr1) == reflect.TypeOf([]interface{}{}) {
for _, arr2 := range arr1.([]interface{}) {
if reflect.TypeOf(arr2) == reflect.TypeOf([]interface{}{}) {
if len(arr2.([]interface{})) > 2 {
friendName := fmt.Sprintf("%v", arr2.([]interface{})[0])
friendTel := fmt.Sprintf("%v", arr2.([]interface{})[1])
friendDesc := fmt.Sprintf("%v", arr2.([]interface{})[2])
if debugLog {
stdLog.Println(tools.GoID(), friendName, friendTel, friendDesc)
}
}
}
}
}
}
}
}
return
}
沒有留言:
張貼留言