Как изменять данные структуры через адрес?

Есть такая структура:

type DonateScene struct {
    UserID      int64
    Step        int
    Target      int
    Anonymously bool
    LastMessage string
}

var DonateScenes []DonateScene

Так я получаю её адрес и изменяю:

func DonateSceneManager(message *tgapi.Message) bool {
    userID := message.Chat.ID
    var currentScene *DonateScene

    for _, r := range DonateScenes {
        if r.UserID == userID {
            currentScene = &r
        }
    }

    if currentScene == nil {
        DonateScenes = append(DonateScenes, DonateScene{UserID: userID, Step: 1})
        return false
    }

    currentScene.Step++
    fmt.Println(currentScene.Step)
}

Но принтится всегда 2. Такое чувство, что изменения сохранятся в экземпляре объекта, как будто я это делаю так:

var currentScene DonateScene
    
for i, r := range DonateScenes {
    if r.UserID == userID {
        currentScene = r
    }
}
currentScene.Step++ // тут понятно, что не сохранится

Рабочий вариант:

var currentScene DonateScene
var index int
for i, r := range DonateScenes {
    if r.UserID == message.Chat.ID {
        currentScene = r
        index = i
 }
}
DonateScenes[index].Step++

Но мне кажется, что правильно именно через первый вариант делать, так как дальше, по коду, очень много взаимодействий с этим (DonateScenes[index]) объектом.


Ответы (1 шт):

Автор решения: Mark

Вот здесь

for _, r := range DonateScenes {
    if r.UserID == userID {
        currentScene = &r
    }
}

вы сохраняете пойнтер на итератор r, а не на саму структуру в массиве.

Попробуйте сделать так:

for idx, r := range DonateScenes {
    if r.UserID == userID {
        currentScene = &DonateScenes[idx]
        break
    }
}
→ Ссылка