Спред оператора аналог - PullRequest
       25

Спред оператора аналог

0 голосов
/ 21 сентября 2018

У меня есть структура и экземпляр этой структуры:

type Obj struct {
  ssid string
  code string
  mit string
  // and other props (23)
}

var ValidObject = Obj {
  ssid: "AK93-KADJ9-92J76",
  code: "SKO-120O"
  mit: "MSLA-923-OKSW"
}

Я хочу создать фрагмент структур (Obj), который будет содержать ValidObject с изменением только некоторых полей.Я думаю, что лучшим способом объяснить это было бы использование псевдокода, поэтому вот оно (с использованием оператора распространения из JS :)):

var slc = []Obj{
  {
    ...ValidObject,
    code: "Other value",
  },
  {
    ...ValidObject,
    mit: "Other value"
  }
}

Ответы [ 2 ]

0 голосов
/ 21 сентября 2018

Создайте глобальный фрагмент структуры var objCollector = []obj{} и считайте данные в определенную структуру, а append объект - в созданный нами фрагмент структуры.

type Obj struct {
    ssid string
    code string
    mit  string
}

var objCollector = []obj{}

func main() {
    var ValidObject = Obj{
        ssid: "AK93-KADJ9-92J76",
        code: "SKO-120O",
        mit:  "MSLA-923-OKSW",
    }
    append(objectCollector, ValidObject)
}
0 голосов
/ 21 сентября 2018

Создайте вспомогательную функцию, которая принимает Object, изменяет ее code и возвращает новый Object:

func withCode(obj Obj, code string) Obj {
    obj.code = code
    return obj
}

Обратите внимание, что withCode принимает значение без указателя, поэтомуObject вы пройдете не будут изменены, только локальная копия.

И с помощью этого ваша задача:

var slc = []Obj{
    withCode(ValidObject, "Other value"),
    withCode(ValidObject, "Yet another value"),
}
fmt.Println(slc)

Вывод (попробуйте на Go Playground ):

[{AK93-KADJ9-92J76 Other value MSLA-923-OKSW}
    {AK93-KADJ9-92J76 Yet another value MSLA-923-OKSW}]

Этот помощник withCode может даже быть методом (а не функцией).

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

Например:

func (o Obj) withCode(code string) Obj {
    o.code = code
    return o
}

func (o Obj) withSsid(ssid string) Obj {
    o.ssid = ssid
    return o
}

func (o Obj) withMit(mit string) Obj {
    o.mit = mit
    return o
}

И затем использовать его:

var slc = []Obj{
    ValidObject.withCode("code2").withSsid("ssid2"),
    ValidObject.withMit("mit2").withSsid("ssid3"),
}
fmt.Println(slc)

Вывод (попробуйтена игровой площадке Go ):

[{ssid2 code2 MSLA-923-OKSW} {ssid3 SKO-120O mit2}]
...