Как написать метод, который назначает член массива для себя - PullRequest
0 голосов
/ 10 января 2019

У меня есть массив структур и метод для нахождения структуры с заданным идентификатором в этом массиве. Если он существует, я хочу скопировать его в саму структуру. Но я не могу заставить это работать.

Я могу заставить его работать с Marshal и Unmarshal, но я не думаю, что это хорошее решение.

https://play.golang.org/p/16giIQ0R1Hv

package main

import (
    "fmt"
)

type Tmp struct {
    ID  int
    Val int
}

var members []Tmp

func (o *Tmp) FindID(id int) {
    for i := range members {
        if members[i].ID == id {
            fmt.Println("found!")
            fmt.Println(members[i])
            tmp := members[i]
            o = &tmp
        }
    }
}

func main() {
    for i := 0; i < 5; i++ {
        o := Tmp{ID: i, Val: i * 2}
        members = append(members, o)
    }
    fmt.Println(members)
    a := Tmp{}
    a.FindID(3)
    fmt.Println(a)
}

Это выводит:

[{0 0} {1 2} {2 4} {3 6} {4 8}]
found!
{3 6}
{0 0}

1 Ответ

0 голосов
/ 10 января 2019

Вы можете использовать оператор разыменования для присвоения значения указателю

*o = members[i]

Итак, в вашем случае:

func (o *Tmp) FindID(id int) bool {
    for i := range members {
        if members[i].ID == id {
            *o := members[i]
            return true
        }
    }
    return false
}

Я позволил функции указать (через возвращаемые значения), действительно ли она что-то нашла или нет; Конечно, вы можете игнорировать это изменение.

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