# 數組make參數錯誤
(金慶的專欄 2020.3)
用 mgo 的 Bulk 接口操作 mongodb 的代碼,在 mongodb 4.2 正常,
而連 mongodb 2.6 報錯:
```
error parsing element 0 of field documents :: caused by :: wrong type for '0' field, expected object, found 0: null
```
代碼如下:
```
func (u *Util) AddUsers(userIDs []int) error {
docs := make([]interface{}, len(userIDs))
for _, userID := range userIDs {
docs = append(docs, dbdoc.UsersDoc{
UserID: userID,
})
}
bulk := u.c().Bulk()
bulk.Insert(docs...)
_, err := bulk.Run()
return err
}
```
試著改成如下調用就成功:
```
func (u *Util) AddUsers(userIDs []int) error {
bulk := u.c().Bulk()
for _, userID := range userIDs {
bulk.Insert(dbdoc.UsersDoc{
UserID: userID,
})
}
_, err := bulk.Run()
return err
}
```
而 Insert() 無論是多個還是單個參數,底層實現是一樣的。
輸入單個如 []int{123} 還是出錯.
將 Insert(docs...) 改成 Insert(docs[0]) 時發現元素為空。
最終找到了錯誤的代碼行:
```
- docs := make([]interface{}, len(userIDs))
+ docs := make([]interface{}, 0, len(userIDs))
```
高版本的mongodb結果正確應該是他忽略了空的文檔。
感覺 golang make() 即可以2個參數也可以3個參數調用的設計是個錯誤。
(金慶的專欄 2020.3)
用 mgo 的 Bulk 接口操作 mongodb 的代碼,在 mongodb 4.2 正常,
而連 mongodb 2.6 報錯:
```
error parsing element 0 of field documents :: caused by :: wrong type for '0' field, expected object, found 0: null
```
代碼如下:
```
func (u *Util) AddUsers(userIDs []int) error {
docs := make([]interface{}, len(userIDs))
for _, userID := range userIDs {
docs = append(docs, dbdoc.UsersDoc{
UserID: userID,
})
}
bulk := u.c().Bulk()
bulk.Insert(docs...)
_, err := bulk.Run()
return err
}
```
試著改成如下調用就成功:
```
func (u *Util) AddUsers(userIDs []int) error {
bulk := u.c().Bulk()
for _, userID := range userIDs {
bulk.Insert(dbdoc.UsersDoc{
UserID: userID,
})
}
_, err := bulk.Run()
return err
}
```
而 Insert() 無論是多個還是單個參數,底層實現是一樣的。
輸入單個如 []int{123} 還是出錯.
將 Insert(docs...) 改成 Insert(docs[0]) 時發現元素為空。
最終找到了錯誤的代碼行:
```
- docs := make([]interface{}, len(userIDs))
+ docs := make([]interface{}, 0, len(userIDs))
```
高版本的mongodb結果正確應該是他忽略了空的文檔。
感覺 golang make() 即可以2個參數也可以3個參數調用的設計是個錯誤。