在Go中,我被分配去接管一个不是我写的项目。我有需要更新其内容的站点列表。
在后端,我有一个函数“ buildmetadata.go”,我需要运行该函数来更新包含所有站点的BoltDB。
“ buildmetadata.go”读取一个包含站点的.csv文件,它应该更新BoltDB,并且应该在CMS中显示更新的列表。
我从一开始就收到错误“ Panic:运行时错误:索引超出范围”,但是我还没有对代码产生疑惑。
日志:
Panic: runtime error: index out of range
goroutine 1 [running]:
main.main.func2(0xc0002f0fc0, 0x4ef880, 0xc0002f0fc0)
/appl/src/auction/workers/buildmetadb.go:127 +0x403
github.com/boltdb/bolt.(*DB).Update(0xc000072000, 0xc00003fda8, 0x0, 0x0)
/appl/src/github.com/boltdb/bolt/db.go:598 +0x90
main.main()
/appl/src/auction/workers/buildmetadb.go:120 +0x757
exit status 2
代码:
func main() {
// Open the my.db data file in your current directory.
// It will be created if it doesn't exist.
db, err := bolt.Open("/appdata/metadata.db", 0600, nil)
if err != nil {
log.Fatal(err)
}
defer db.Close()
csvfile, err := os.Open("./techdocdata.csv")
if err != nil {
fmt.Println("BIG Error:", err)
}
defer csvfile.Close()
reader := csv.NewReader(csvfile)
reader.Comma = ','
reader.Read()
//cbService.CouchbaseSet("BIVA::counter", 0)
for {
record, err := reader.Read()
//cbService.CouchbaseSet("BIVA::counter", 0)
if err == io.EOF {
break
} else if err != nil {
fmt.Println(err)
}
db.Update(func(tx *bolt.Tx) error {
root, err := tx.CreateBucketIfNotExists([]byte("make"))
if err != nil {
return fmt.Errorf("create bucket: %s", err)
}
if err != nil {
return err
}
err = root.Put([]byte(record[0]), []byte(record[0]))
if err != nil {
return err
}
subroot, err := tx.CreateBucketIfNotExists([]byte("models"))
if err != nil {
return fmt.Errorf("create bucket: %s", err)
}
if err != nil {
return err
}
bk, err := subroot.CreateBucketIfNotExists([]byte(record[0]))
if err != nil {
return fmt.Errorf("create bucket: %s", err)
}
err = bk.Put([]byte(record[1]), []byte(record[1]))
if err != nil {
return err
}
return nil
})
}
csvfile2, err := os.Open("./hedindealers.csv")
if err != nil {
fmt.Println("BIG Error:", err)
}
defer csvfile2.Close()
reader = csv.NewReader(csvfile2)
reader.Comma = ','
reader.Read()
//cbService.CouchbaseSet("BIVA::counter", 0)
for {
record, err := reader.Read()
log.Println(record)
//cbService.CouchbaseSet("BIVA::counter", 0)
if err == io.EOF {
break
} else if err != nil {
fmt.Println(err)
}
db.Update(func(tx *bolt.Tx) error {
root, err := tx.CreateBucketIfNotExists([]byte("dealers"))
if err != nil {
return fmt.Errorf("create bucket: %s", err)
}
err = root.Put([]byte(record[0]), []byte(record[1]+"::"+record[2]+"::"+record[3]+"::"+record[4]))
if err != nil {
return err
}
return nil
})
}
//send file to sosfile
fmt.Print("Done!")
}
CSV:
Site A i Mölndal, Mercedes-Benz - Personbilsförsäljning,Västra Götaland,Mölndal,Flöjelbergsgatan
Site B i Borås - Personbilsförsäljning,Västergötland,Borås,Pickesjövägen
Site C i Göteborg, Hisings Kärra - Personbilsförsäljning,Västergötland,Göteborg,Orrekulla Industrigata
在线错误:
err = root.Put([]byte(record[0]), []byte(record[1]+"::"+record[2]+"::"+record[3]+"::"+record[4]))
csv文件中对原始文件的任何更改都会引发此错误。