簡體   English   中英

無法在Golang中的for循環中重用單個變量

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM