[英]Cannot reuse a single variable in for loop in Golang
我想創建一個指針並在每次迭代中使用它,但是在中,我得到所有相同的值。所以我找到了在每次迭代中創建指針的解決方案。 但是這種方法似乎浪費了很多內存。
有沒有辦法在golang中重用相同的變量?
這是我的代碼
func GetSchedules(start, end time.Time, usr *user.User) ([]*Scheduler, error) {
queryStr := []string{"SELECT account_id,link,text,time,image_links from", Table, "where user_id=?"}
var results = make([]*Scheduler, 0)
rows, err := DB.MYSQL_DB.Query(strings.Join(queryStr, " "), usr.Id.Hex())
if nil != err {
return results, err
}
defer rows.Close()
a := new(Scheduler)
for rows.Next() {
cols := []interface{}{&a.AccountId, &a.Link, &a.Text, &a.Time, &a.Images}
fmt.Println(rows.Scan(cols...))
results = append(results, a)
}
return results, nil
}
這里的問題是a
叫做a
的變量,盡管我在每次迭代中都將新東西掃描進去,但是它一直顯示最后一個,而結果切片僅多次包含最后一個項
在您有證據證明它是應用程序的瓶頸之前,請不要擔心GC。 從DB讀取數據時,GC永遠不會成為您的瓶頸。 這是一個簡單的基准:
func BenchmarkReallocate(b *testing.B) {
for i := 0; i < b.N; i++ {
results := make([]*foo, 0)
for i := 0; i < 100; i++ {
f := new(foo)
f.bar = "baz"
results = append(results, f)
}
}
}
func BenchmarkReuse(b *testing.B) {
for i := 0; i < b.N; i++ {
results := make([]*foo, 0)
var f *foo
for i := 0; i < 100; i++ {
f = new(foo)
f.bar = "baz"
results = append(results, f)
}
}
}
運行go test -bench . -benchmem
結果go test -bench . -benchmem
go test -bench . -benchmem
:
BenchmarkReallocate-8 300000 4416 ns/op 3640 B/op 108 allocs/op
BenchmarkReuse-8 300000 4359 ns/op 3640 B/op 108 allocs/op
PASS
因此,最終這兩種方式都會導致完全相同的分配量。
從DB到struct的典型讀法如下所示:
rows, err := db.Query("SELECT * FROM foo")
if nil != err {
return nil, err
}
defer rows.Close()
results := make([]*Scheduler, 0)
for rows.Next() {
var s Scheduler
if err := rows.Scan(&s.Id, &s.Name, &s.Something); err != nil {
return nil, err
}
results = append(results, &s)
}
if err := rows.Err(); err != nil { // Don't forget to check rows.Err()
return nil, err
}
return results, nil
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.