Обновление значения из структуры в Голанге - PullRequest
0 голосов
/ 18 июня 2019

Я пытаюсь обновить поле из Горм. Я загружаю все карусели из базы данных, и у меня есть тикер, который проверяет поле «LastRun», и я хочу установить новое значение time.Now () при его запуске.

На данный момент мне нужно только обновить загруженную структуру, так что я знаю, что это не записывает изменения в БД в данный момент.

Как мне обновить поле carousel.LastRun в func Sequencer () в этом примере? Он продолжает иметь старое значение из БД, что бы я ни делал ...

package main

import (
    "fmt"
    "github.com/jinzhu/gorm"
    _ "github.com/jinzhu/gorm/dialects/sqlite"
    "sync"
    "time"
)

var (
    db *gorm.DB
    wg = &sync.WaitGroup{}
)

type Carousel struct {
    gorm.Model
    Name        string
    Description string
    Duration    uint
    LastRun     time.Time
    Index       uint8
    State       State
}

type State struct {
    Type string
}

func main() {
    path := "pkg/database/database.db"
    db, err := gorm.Open("sqlite3", path)
    if err != nil {
        panic("failed to connect database")
    }
    defer db.Close()

    db.AutoMigrate(&Carousel{})

    var carousels []Carousel
    db.Find(&carousels)
    wg.Add(1)
    Sequencer(&carousels)
    wg.Wait()
}

func Sequencer(carousels *[]Carousel) {

    ticker := time.NewTicker(1000 * time.Millisecond)
    for range ticker.C {
        for _, carousel := range *carousels {
            next := carousel.LastRun.Add(time.Millisecond * time.Duration(carousel.Duration))
            if next.Sub(time.Now()) <= 0 {
                fmt.Println("Carousel: ", carousel.Name, "Last run: ", time.Since(carousel.LastRun))
                carousel.LastRun = time.Now()
                /* How do I update the carousel.LastRun ? */
            }
        }
    }
}

1 Ответ

0 голосов
/ 18 июня 2019

Чтобы обновить структуру карусели, вы можете сделать это:

func Sequencer(carousels []*Carousel) {

ticker := time.NewTicker(1000 * time.Millisecond)
for range ticker.C {
    for i, _ := range carousels {
        carousel = carousels[i]
        next := carousel.LastRun.Add(time.Millisecond * time.Duration(carousel.Duration))
        if next.Sub(time.Now()) <= 0 {
            fmt.Println("Carousel: ", carousel.Name, "Last run: ", time.Since(carousel.LastRun))
            carousel.LastRun = time.Now()
        }
    }
  }
}

При использовании range используемое значение (для переменной carousel в вашем случае) является копией элемента вломтик.Следовательно, даже обновляя его, он не будет обновлять элемент в фактическом списке.

Для этого вам нужно получить доступ к индексу среза, который необходимо обновить, и затем выполнить ваши изменения.

...