Как заставить Golang fun c создать новый экземпляр структуры - PullRequest
0 голосов
/ 03 апреля 2020

Таким образом, структура содержит данные, которые могут быть видоизменены. Есть ли в Golang какая-то хитрость или техника, которая может рассказать забавному c, что она должна принять новый экземпляр структуры? Другими словами, старайтесь избегать повторного использования данных, которые могли быть изменены до факта или могут быть изменены во время веселого жизненного цикла c. (Я мог бы избежать мутаций, но другие разработчики в моей команде могли не получить памятку).

Для иллюстрации:

type CMRequest struct {
  Endpoint    string
  Method      string
}

func (cmreq CMRequest) Run() (res *goreq.Response) {
 /// this could mutate cmreq
}

очевидно, что Run () может изменять данные в cmreq, поэтому Мне интересно, есть ли хороший шаблон для принудительного создания данных fre sh каждый раз? Единственное, о чем я могу думать, - это сохранить структуру private и сделать что-то вроде этого:

type cmrequest struct {
  Endpoint    string
  Method      string
}

func (cmreq cmrequest) Run() (res *goreq.Response) {
 /// this could mutate cmreq
}

, а затем выставить вспомогательное удовольствие c:

func MakeRequestAndUnmarshalBody(d CMRequestNoReuse) (*goreq.Response) {

  // check that d has a unique memory location?

  cmreq := NewCPRequest(d)
  res := cmreq.Run()

  return res
}

, чтобы хелпер fun c будет опубликован c, и он будет каждый раз создавать новый экземпляр структуры? есть ли другой способ go об этом? Я до сих пор не могу заставить пользователя каждый раз вводить новые данные, хотя могу проверить, является ли ячейка памяти d CMRequestNoReuse уникальной?

1 Ответ

1 голос
/ 03 апреля 2020

На самом деле, нет, в вашем примере это не изменяет данные в CMRequest экземпляре:

func (cmreq CMRequest) Run() (res *goreq.Response) {
 /// this could mutate cmreq
}

Когда вы передаете объект по значению, вы фактически получаете его копию, а не ссылку на него .

Чтобы мутировать, нужно пройти по указателю. Т.е. метод Run будет выглядеть следующим образом:

func (cmreq *CMRequest) Run() (res *goreq.Response) {
 /// this actually can mutate cmreq
}

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

Вот пример на детской площадке go . Но обратите внимание, если одно из полей структуры является указателем - вы все равно можете изменить его.

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